Разработка агрегатора курсов криптовалют под ключ

Один источник данных о курсах криптовалют — это риск манипуляций и убытков. Мы разрабатываем агрегатор курсов криптовалют, который собирает информацию с ведущих бирж и DeFi-протоколов, применяя TWAP-фильтрацию для защиты от флеш-кредитных атак. Наша команда реализует проект под ключ — от аудита до внедрения и последующей поддержки, обеспечивая надёжное и масштабируемое решение.
Часто задаваемые вопросы

DeFi-протокол потерял $600,000 из-за манипуляции ценой через флеш-кредит. Причина — единственный оракул. Мы разрабатываем агрегатор курсов криптовалют, который решает эту проблему: собирает данные из 5+ источников (Binance, OKX, Bybit, Kraken, Uniswap) и применяет TWAP-фильтрацию. BTC/USDT на Binance отличается от Bybit, OKX, Kraken и от on-chain цены в Uniswap пуле. Агрегатор вычисляет единый «справедливый» курс или показывает разброс для прайсинга в платёжных системах, отображения в кошельках, арбитражных стратегий, риск-менеджмента, DeFi оракулов. Наш агрегатор обрабатывает десятки торговых пар с обновлением каждые 100 мс — критически важно для арбитража и ликвидности.

Разработчик агрегатора: "TWAP-фильтрация предотвращает манипуляции, которые стоят миллионы."

Как разрабатывается агрегатор курсов криптовалют?

Единый оракул — точка отказа. Агрегатор курсов криптовалют снижает риски манипуляции, комбинируя данные CEX и DEX с верификацией через TWAP. Это предотвращает потери, которые могут достигать миллионов долларов, как в случае известных flash loan атак.

Основные сложности: синхронизация данных с разной задержкой (10 мс для CEX, 12-15 сек для DEX), защита от флеш-кредитных атак на пулы, обнаружение аномалий курсов. Мы решаем их через комбинацию VWAP и медианы с динамическим отбрасыванием выбросов.

Как собираются данные с разных бирж?

Каждая биржа — отдельный коллектор с переподключением при разрыве. Используем TypeScript и событийную модель на Node.js.

import WebSocket from 'ws';
import { EventEmitter } from 'events';

interface PriceEvent {
  source: string;
  pair: string; // 'BTC/USDT'
  price: number;
  volume24h: number;
  timestamp: number; // ms
}

class BinanceCollector extends EventEmitter {
  private ws: WebSocket | null = null;
  private pairs: string[];
  private reconnectTimer: NodeJS.Timeout | null = null;

  constructor(pairs: string[]) {
    super();
    this.pairs = pairs;
  }

  connect() {
    const streams = this.pairs
      .map(p => `${p.replace('/', '').toLowerCase()}@ticker`)
      .join('/');

    this.ws = new WebSocket(`wss://stream.binance.com:9443/stream?streams=${streams}`);

    this.ws.on('message', (data: string) => {
      const msg = JSON.parse(data);
      if (msg.stream && msg.data) {
        const ticker = msg.data;
        this.emit('price', {
          source: 'binance',
          pair: this.normalizePair(ticker.s),
          price: parseFloat(ticker.c),
          volume24h: parseFloat(ticker.v) * parseFloat(ticker.c),
          timestamp: ticker.E,
        } as PriceEvent);
      }
    });

    this.ws.on('close', () => {
      this.reconnectTimer = setTimeout(() => this.connect(), 5000);
    });

    this.ws.on('error', (err) => {
      console.error('Binance WS error:', err.message);
    });
  }

  private normalizePair(symbol: string): string {
    const quoteAssets = ['USDT', 'USDC', 'BTC', 'ETH', 'BNB'];
    for (const quote of quoteAssets) {
      if (symbol.endsWith(quote)) {
        return `${symbol.slice(0, -quote.length)}/${quote}`;
      }
    }
    return symbol;
  }
}

Аналогичные коллекторы для OKX, Bybit, Kraken. Для каждого источника настроены автоматические переподключения и логирование ошибок.

On-chain цены из Uniswap V3

Spot цена из пула — sqrtPriceX96. Декодирование с помощью viem:

import { createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';

const UNISWAP_V3_POOL_ABI = [
  {
    name: 'slot0',
    type: 'function',
    inputs: [],
    outputs: [
      {
        name: 'sqrtPriceX96',
        type: 'uint160',
      },
      {
        name: 'tick',
        type: 'int24',
      },
    ],
    stateMutability: 'view',
  },
] as const;

async function getUniswapPrice(poolAddress: string): Promise<number> {
  const slot0 = await client.readContract({
    address: poolAddress as `0x${string}`,
    abi: UNISWAP_V3_POOL_ABI,
    functionName: 'slot0',
  });
  const sqrtPriceX96 = BigInt(slot0.sqrtPriceX96);
  // price = (sqrtPriceX96 / 2^96)^2 * (10^token0Decimals / 10^token1Decimals)
  const price = Number((sqrtPriceX96 ** 2n * BigInt(1e18)) / (2n ** 192n)) / 1e18;
  return price;
}

TWAP из Uniswap V3 надёжнее spot-цены — манипуляция требует удержания большого объёма в пуле в течение нескольких блоков. Для оракулов используем TWAP за 30 минут.

Какие методы агрегации мы применяем?

Простое среднее — плохой агрегатор: один источник с ошибочной ценой тянет среднее в сторону. Используем комбинацию:

Метод Устойчивость к выбросам Когда применять
VWAP (взвешенное по объёму) Средняя Высоколиквидные пары, CEX-источники
Медиана Высокая 5+ источников, DeFi-аналитика
Отбрасывание выбросов + медиана Очень высокая Всегда, как базовый фильтр

VWAP рассчитывается как сумма цен, взвешенных по объёму. Медиана устойчива к выбросам. Обнаружение аномалий — обязательно: отбрасываем цены, отклоняющиеся от медианы более чем на 2%.

import statistics

def filter_outliers(prices: list[float], threshold: float = 0.02) -> list[float]:
    median = statistics.median(prices)
    return [p for p in prices if abs(p - median) / median <= threshold]

def vwap(prices: list[dict]) -> float:
    total_volume = sum(p['volume24h'] for p in prices)
    if total_volume == 0:
        return sum(p['price'] for p in prices) / len(prices)
    return sum(p['price'] * p['volume24h'] for p in prices) / total_volume

Сравнение источников: CEX vs DEX

Параметр CEX (Binance, OKX) DEX (Uniswap V3)
Задержка ~10-50 мс ~12-15 сек (блок)
Объём Высокий, до $1B+ в день Средний, зависит от пула
Манипуляция Возможна через спред Сложнее, требует флеш-кредитов
Надёжность Зависит от API биржи Зависит от блокчейна

Выбор между CEX и DEX зависит от требований к задержке и устойчивости. Для реалтайм-приложений (трейдинг) предпочтительны CEX, для DeFi-оракулов — DEX с TWAP.

Как мы обеспечиваем отказоустойчивость?

  • Circuit breaker: если источник выдаёт ошибки > 5 раз за 30 секунд — отключаем на 60 секунд.
  • Staleness check: если данные не обновлялись > 30 секунд — исключаем из агрегации.
  • Minimum sources: при активных источниках < 2 возвращаем ошибку вместо неверного курса.
  • Метрики Prometheus: price_sources_active, price_update_latency_ms, price_deviation_percent — алерт при аномалиях.

Все компоненты контейнеризированы (Docker) и оркестрируются через Docker Compose или Kubernetes. Каждый коллектор запускается в отдельном контейнере, агрегатор — в одном экземпляре с поддержкой горизонтального масштабирования через Redis Pub/Sub. Для мониторинга используем Prometheus и Grafana. Развёртывание автоматизировано через CI/CD (GitLab CI).

Пример архитектурыАгрегатор состоит из: коллекторов (по одному на источник), ядра агрегации (Python, Redis), API-сервера (FastAPI) и дашборда (Grafana). Все упаковано в контейнеры.

Процесс разработки: от проектирования до продакшена

  1. Проектирование (2-3 дня): согласовываем список пар и источников, требования к latency, схему хранения.
  2. Коллекторы (3-4 дня): разработка и тестирование каждого источника, нормализация формата.
  3. Агрегация (2-3 дня): выбор алгоритма взвешивания, outlier detection, Redis хранение.
  4. API (2-3 дня): REST + WebSocket, документация, rate limiting.
  5. Нагрузочное тестирование (1-2 дня): 100+ пар одновременно, поведение при потере источника.

Итого 1-2 недели для агрегатора с 3-5 источниками и 50+ торговыми парами.

Что входит в работу

  • Архитектурная документация (схемы, описание потоков)
  • Репозиторий с исходным кодом (коллекторы, агрегатор, API)
  • Документация API (Swagger/OpenAPI)
  • Отчёт о нагрузочном тестировании
  • Скрипты для развёртывания (Docker Compose/K8s манифесты)
  • Инструкция по запуску и мониторингу
  • Обучение команды (1-2 часа)

Типичные ошибки при разработке агрегатора

  • Использование только spot-цены вместо TWAP — уязвимость к флеш-кредитным атакам.
  • Отсутствие outlier detection — одна ошибочная цена искажает всё среднее.
  • Нет circuit breaker — при падении биржевого API агрегатор зависает.
  • Слишком маленький пул источников (<3) — снижает надёжность.

Избежав этих ошибок, вы получите устойчивый к манипуляциям агрегатор курсов криптовалют. Наш опыт: 10+ лет в разработке блокчейн-решений, 50+ проектов по криптовалютам, 5 лет на рынке. Гарантируем стабильную работу агрегатора.

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

Направления блокчейн-разработки

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1394
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1369
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    816
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1142