Перейти к содержимому
Все статьи
Блокчейн

Оракулы в блокчейне: манипуляция ценой и защита контракта

·30 октября 2026 г.· 11 мин чтения
Нужен смарт-контракт или dApp?Разработка смарт-контрактов

Оракул в блокчейне — это сервис, который приносит в смарт-контракт данные извне: курс валюты, цену токена, результат события. Сам контракт мир за пределами сети не видит. Главный риск — манипуляция ценой: если контракт берёт цену из текущего состояния одного пула ликвидности, её можно временно исказить крупной сделкой в той же транзакции. Защита — децентрализованные ценовые фиды вроде Chainlink с проверкой свежести, усреднённые по времени цены (TWAP), сравнение нескольких источников и лимиты на отклонение.

Зачем контракту оракул

Блокчейн детерминирован: каждый узел должен получить одинаковый результат, поэтому контракт не может просто сходить в API биржи. Данные должен кто-то записать в сеть транзакцией. Это и делает оракул. Подробное описание проблемы есть на странице ethereum.org об оракулах.

ЗадачаКакие данные нужныЧем опасна ошибка
Кредит под залогЦена залогаНесправедливые ликвидации или выдача займа под переоценённый залог
Синтетические активыЦена базового активаВыпуск токенов по неверному курсу
Стейкинг с наградами в долларахКурс токена наградыПереплата или недоплата
Страхование и ставки на событияФакт событияВыплата по ложному событию
Игры и лотереиСлучайное числоПредсказуемый результат

Почему цена из пула — плохой оракул

Цена в пуле автоматического маркетмейкера определяется соотношением резервов. Крупная сделка сдвигает это соотношение. Если в одной транзакции сначала сдвинуть цену, затем вызвать ваш контракт, который читает текущие резервы, и потом вернуть цену обратно, контракт увидит искажённое значение. Для такой сделки не нужны собственные деньги: флеш-займы позволяют взять крупную сумму и вернуть её в пределах той же транзакции. Мы не описываем шаги атаки — для защиты важен сам принцип: всё, что можно изменить в той же транзакции, нельзя использовать как цену.

Важно и то, что манипуляция не всегда требует сложной схемы. В пуле с маленькой ликвидностью цену сдвигает даже обычная крупная сделка. Поэтому, выбирая источник, оценивают не только механизм, но и глубину рынка за ним: сколько стоило бы сдвинуть цену на 10% и удержать её нужное время.

Источники цены: сравнение

ИсточникУстойчивость к манипуляции в одной транзакцииСлабые места
Текущая цена одного пула (spot)НизкаяИскажается крупной сделкой и флеш-займом
TWAP пула (средняя за период)Средняя или высокая, зависит от окна и ликвидностиЗапаздывает, дорогой сдвиг всё же возможен в тонких пулах
Децентрализованный фид (например, Chainlink)ВысокаяОбновляется по порогу и таймеру, может устареть, зависит от провайдера
Свой оракул (бэкенд пишет цену)Зависит от ключаЕдиная точка отказа и компрометации
Комбинация двух источниковВысокаяСложнее логика, нужно решить, что делать при расхождении

Защита 1. Проверки при чтении Chainlink

Ценовые фиды Chainlink обновляются, когда цена отклоняется больше порога или когда истёк интервал (heartbeat). Функция latestRoundData() возвращает цену и время последнего обновления. Ошибка, которую находят в аудитах постоянно, — использовать цену без проверок.

  1. (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData();
  2. if (answer <= 0) revert InvalidPrice(); — отрицательная или нулевая цена недопустима.
  3. if (block.timestamp - updatedAt > MAX_DELAY) revert StalePrice(); — цена не старше допустимой задержки, привязанной к heartbeat конкретного фида.
  4. uint8 dec = feed.decimals(); — приводите цену к своим десятичным знакам, у разных фидов они различаются.
  5. Ограничьте результат разумным диапазоном и отклоняйте значения за его пределами.

Особенность L2: статус секвенсора

В роллапах транзакции упорядочивает секвенсор. Если он остановился, цены в фиде не обновляются, а после перезапуска первые транзакции могут исполниться по устаревшим данным. Chainlink публикует для L2-сетей отдельные фиды статуса секвенсора (L2 Sequencer Uptime Feeds). Контракты с ликвидациями проверяют, что секвенсор работает и после его перезапуска прошёл льготный период.

Защита 2. TWAP и окно усреднения

Цена, усреднённая по времени, требует удерживать искажение на протяжении многих блоков, а это дорого и заметно. Чем длиннее окно, тем устойчивее цена к манипуляции, но тем сильнее она отстаёт от рынка. Выбор окна — компромисс, который нужно обосновать в документации. Для тонких пулов с малой ликвидностью даже TWAP остаётся рискованным.

Защита 3. Архитектурные ограничения

  • Два источника и сверка. Если цена Chainlink и TWAP расходятся больше порога, операции, зависящие от цены, приостанавливаются.
  • Лимиты. Максимальная сумма займа или вывода за период ограничивает ущерб, даже если цена искажена.
  • Задержка операций. Депозит и вывод в одной транзакции запрещены, нужна пауза хотя бы в один блок.
  • Смена оракула через таймлок. Адрес фида меняется не мгновенно, а с задержкой, иначе компрометация администратора даёт возможность подставить свой «оракул».
  • Аварийная пауза. При обнаружении аномалии операции можно остановить. О правах на паузу — в статье о контроле доступа.

Что делать, когда оракул не отвечает

Решение о поведении при отказе оракула принимают заранее, а не во время инцидента. Для каждой операции, зависящей от цены, нужна политика: остановиться, использовать запасной источник или продолжить с ограничениями. Безопасное правило по умолчанию — операции, которые выдают деньги, при сомнительной цене останавливаются, а операции, которые уменьшают риск пользователя (погашение долга, пополнение залога), продолжают работать.

СитуацияБезопасная реакцияЧего избегать
Цена устарелаОстановить займы и выводы, разрешить погашениеПродолжать ликвидации по старой цене
Источники расходятсяПриостановить зависимые операции, оповестить командуБрать «более выгодную» цену
Цена вне разумного диапазонаОтклонить и записать событиеОбрезать до границы и продолжать молча
Секвенсор L2 перезапущенВыждать льготный периодСразу ликвидировать позиции
Фид выведен из эксплуатацииПерейти на новый адрес через таймлокМенять адрес мгновенно одним ключом

Случайные числа — тоже оракул

block.timestamp, хеш блока и block.prevrandao не подходят как источник случайности для призов: значения известны или частично влияемы теми, кто формирует блок. Для лотерей, розыгрышей NFT и игр используют верифицируемую случайность (VRF) или схему commit-reveal, где участники сначала фиксируют хеш выбора, а потом раскрывают его.

Как проверить свой контракт

  1. Найдите все места, где контракт читает цену или курс.
  2. Для каждого определите источник и можно ли его изменить в той же транзакции.
  3. Проверьте наличие проверок свежести, знака и десятичных знаков.
  4. Для L2 проверьте учёт статуса секвенсора.
  5. Напишите тест на форке сети с подменой ответа оракула: устаревшая цена, ноль, резкий скачок. Как это сделать — в статье о тестировании смарт-контрактов.
  6. Опишите в документации, что происходит при отказе оракула.

Интеграции с оракулами — одна из самых чувствительных частей контракта, и её обязательно смотрит аудитор. Перед этим пройдите чек-лист подготовки к аудиту. Спроектировать работу с ценами можно вместе с командой разработки смарт-контрактов, а наблюдение за расхождением источников входит в мониторинг контрактов.

Вопросы и ответы

Что такое оракул в блокчейне простыми словами?

Это сервис, который записывает в блокчейн данные из внешнего мира, например курс валюты. Смарт-контракт сам не может обратиться к сайту или бирже, поэтому получает такие данные через оракул.

Что такое манипуляция ценой оракула?

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

Достаточно ли использовать Chainlink?

Это сильно снижает риск, но не убирает его. Нужно проверять свежесть и корректность ответа, учитывать десятичные знаки и статус секвенсора в L2, а также ограничивать ущерб лимитами.

Что такое TWAP?

Это средняя цена за период, например за 30 минут, рассчитанная по истории пула. Её труднее исказить одной сделкой, но она запаздывает за рынком, поэтому окно усреднения выбирают под задачу.

Можно ли использовать хеш блока как случайное число?

Для чего-либо ценного — нет. Эти значения известны или частично влияемы теми, кто формирует блок. Для розыгрышей используют верифицируемую случайность или схему commit-reveal.

Нужна помощь с проектом?

Обсудим задачу и предложим решение — от сайта до SaaS и защиты.

Связаться