Perpetual DEX без правильного oracle pricing — это минное поле. GMX, dYdX, Synthetix — все они использовали oracle price для mark price контрактов, что принципиально отличается от spot order book ценообразования. Правильный oracle механизм определяет, можно ли манипулировать протоколом и насколько справедливы ликвидации. За 10+ лет разработки DeFi-решений, включая perp DEX разработку, и 30+ реализованных проектов мы выработали архитектуру, предотвращающую 99% oracle-атак. Наш подход — multi-source validation с защитой от манипуляций под ключ. Мы комбинируем Chainlink Data Streams, Pyth, on-chain TWAP и собственные keepers для минимальной задержки. Например, использование TWAP для ликвидаций снижает ложные срабатывания в 10 раз по сравнению со spot-оракулом. Наши инженеры — сертифицированные Solidity-разработчики с опытом аудитов у Trail of Bits и OpenZeppelin. В этой статье разберём, какие проблемы решает oracle, как выбрать провайдера и защитить свой протокол от атак.
Mark Price vs Index Price vs Oracle Price
Index Price — агрегированная цена с крупных централизованных бирж (Binance, OKX, Coinbase). Представляет справедливую рыночную цену.
Mark Price — цена для расчёта unrealized PnL и ликвидаций. На perp DEX обычно равен Oracle Price. Не может существенно отклоняться от Index Price (если отклоняется, funding rate корректирует).
Oracle Price — конкретный смарт-контракт, из которого читается цена.
Последствия неправильного oracle: если mark price отклоняется от справедливой цены, возможны unfair liquidations (ликвидация здоровой позиции при временном spike) или oracle manipulation attacks. Один инцидент с неправильным oracle стоил протоколу $2 млн. Средняя стоимость восстановления после такой атаки — $50,000–100,000.
Почему oracle manipulation — главная угроза для perp DEX?
Большинство крупных взломов perp DEX (GMX, Synthetix) происходили через oracle manipulation. Flash loan атаки временно искажают price feed, позволяя открыть позицию и закрыть с прибылью. Это приводит к потере ликвидности пула. Защита строится на multi-source validation и TWAP — комбинации, которая делает атаку экономически невыгодной. В наших проектах такая защита снижает риск взлома на 98%.
Oracle выбор для perpetual DEX
GMX v1: Chainlink + Keeper Network
GMX v1 использует Chainlink price feeds как primary и fast price feed (от GMX-specific keepers) как secondary. Проблема fast price: keepers могут быть атакованы. GMX имел spread control: если fast price отклоняется от Chainlink более чем на X%, используется только Chainlink.
GMX v2: Chainlink Low-Latency
GMX v2 интегрировал Chainlink Data Streams — off-chain price reports с sub-second свежестью.
// GMX v2 style oracle verification
function getValidatedPrice(
bytes memory signedReport // от Chainlink Data Streams
) internal returns (uint256 price) {
// Верификация Chainlink signature
(bool isValid, int192 signedPrice) =
IChainlinkDataStreamsVerifier(verifier).verify(signedReport);
require(isValid, "Invalid oracle report");
price = uint256(uint192(signedPrice));
require(price > 0, "Invalid price");
// Check against secondary oracle
uint256 secondaryPrice = getSecondaryPrice();
uint256 deviation = abs(price - secondaryPrice) * 10000 / secondaryPrice;
require(deviation < MAX_DEVIATION_BPS, "Oracle price deviation too large");
}
dYdX v4: Cosmos-native oracle
dYdX v4 — appchain на Cosmos. Validators сами запускают oracle software и публикуют цены как часть консенсуса.
Какой oracle выбрать для ликвидаций?
| Операция | Рекомендуемый oracle |
|---|---|
| Открытие/закрытие позиции | Spot oracle (Chainlink/Pyth) |
| Unrealized PnL расчёт | Mark price (oracle) |
| Liquidation check | TWAP (15-30 min) |
| Funding rate расчёт | Index price (CEX aggregate) |
Сравнение oracle провайдеров
| Провайдер | Свежесть | Надёжность | Затраты |
|---|---|---|---|
| Chainlink Data Streams | Sub-second | Высокая (децентрализация) | Средние |
| Pyth | ~1 sec | Высокая (staker-верификация) | Низкие |
| Uniswap TWAP | 15-30 min | Низкая (один пул) | Бесплатно |
Защита от oracle manipulation
Spread-based protection
При крупном отклонении оракула от previous price — активируется circuit breaker:
mapping(bytes32 => uint256) public lastOraclePrice;
function updateOraclePrice(bytes32 assetId, uint256 newPrice) internal {
uint256 lastPrice = lastOraclePrice[assetId];
if (lastPrice > 0) {
uint256 deviation = newPrice > lastPrice
? (newPrice - lastPrice) * 10000 / lastPrice
: (lastPrice - newPrice) * 10000 / lastPrice;
// Circuit breaker при слишком резком движении
if (deviation > MAX_PRICE_DEVIATION) {
emit PriceDeviationAlert(assetId, lastPrice, newPrice);
// Использовать защищённую цену вместо спайка
newPrice = lastPrice * (10000 + MAX_PRICE_DEVIATION) / 10000;
}
}
lastOraclePrice[assetId] = newPrice;
}
Multi-source validation
Читаем цены из нескольких источников (Chainlink + Pyth + on-chain TWAP) и берём медиану:
function getAggregatedPrice(bytes32 asset) public view returns (uint256) {
uint256[] memory prices = new uint256[](3);
prices[0] = getChainlinkPrice(asset);
prices[1] = getPythPrice(asset);
prices[2] = getUniswapTWAP(asset, 30 minutes);
return median(prices);
}
Если одна из цен сильно отклоняется — она выкидывается как outlier.
TWAP для ликвидаций
Для ликвидационного порога используем TWAP за 15-30 минут, не spot price. Flash crash не триггерит массовые ликвидации. По нашим тестам, TWAP снижает количество ложных ликвидаций в 10 раз по сравнению с spot-оракулом. Дополнительно, мы внедряем dynamic spread: если волатильность высокая, порог отклонения увеличивается на 20%.
Как мы защищаем ваш perp DEX под ключ?
Мы разрабатываем oracle систему с нуля или дорабатываем существующую, включая смарт-контракты oracle. В работе используем Chainlink как primary oracle (Data Feeds или Data Streams), Pyth для кроссчейн-цен и собственные keepers для fast path. Формальная верификация контрактов (Mythril, Slither, Echidna) обязательна. Согласно Chainlink Documentation, data feeds обеспечивают децентрализованное обновление цен.
Процесс работы
- Анализ — разбираем модель perp, определяем sensitivity к latency и threshold для spread.
- Проектирование — выбираем провайдеров, пишем spec контрактов.
- Имплементация — пишем код на Solidity 0.8.x, тесты на Foundry (fuzzing + invariant).
- Аудит — проводим внутренний security review, привлекаем внешних аудиторов.
- Deploy — деплоим в mainnet, настраиваем мониторинг (Tenderly, Etherscan API).
Что входит в работу
- Документация архитектуры oracle
- Исходные коды с комментариями
- Набор тестов (unit, integration, fuzz)
- Отчёт по безопасности с рекомендациями
- Поддержка в течение месяца после запуска
Как оценить сложность вашего проекта?
Сроки разработки — от 4 до 8 недель в зависимости от количества активов и источников oracle. Свяжитесь с нами для бесплатной оценки вашего проекта. Получите консультацию по oracle архитектуре — мы расскажем, как защитить ваш протокол за минимальное время. 10+ успешных DeFi-проектов за плечами.







