Разработка централизованной криптобиржи (CEX) — один из самых сложных продуктов в криптоинфраструктуре. Matching engine, кастодиальная система, compliance-слой, market data и обеспечение ликвидности — всё это должно работать одновременно, надёжно и под нагрузкой. Типичные проблемы: latency матчинга более 100 мс, уязвимости в смарт-контрактах, низкая доступность. Мы проектируем и разрабатываем CEX под ключ, опираясь на 8-летний опыт в блокчейн-разработке и 5+ запущенных проектах. Ниже расскажу, что реально нужно для запуска серьёзной платформы.
Как мы проектируем архитектуру CEX?
Высокоуровневая схема
Client Layer
├── Web Trading Terminal (React/Vue)
├── Mobile Apps (iOS/Android)
└── API (REST + WebSocket + FIX)
│
API Gateway / Load Balancer
│
Service Layer
├── Auth Service (JWT + 2FA)
├── Order Service → OMS
├── Account Service → Balances
├── Market Data Service → Feeds
└── Notification Service
│
Core Infrastructure
├── Matching Engine (C++/Rust/Go)
├── Risk Engine
├── Custody System
└── Settlement Engine
│
Data Layer
├── PostgreSQL (accounts, orders, trades)
├── Redis (order book state, sessions)
├── Kafka (event streaming, audit log)
└── TimescaleDB (OHLCV, market data)
Принцип изоляции сервисов
Каждый сервис независим и общается через события (event-driven). Matching engine не знает про пользователей — он знает только про ордера. Account service не знает про торговлю — он знает про балансы. Это позволяет независимо масштабировать компоненты: matching engine на bare metal, остальное на Kubernetes. Сбой notification service не роняет торговлю. Деплой без downtime.
Почему matching engine так критичен?
Matching engine — единственный компонент, где производительность имеет экзистенциальное значение. Задержка >10 ms — это реальные потери для HFT-клиентов и market makers.
| Tier | Throughput | Latency (order-to-ack) | Технология |
|---|---|---|---|
| Start-up (<$1M/day) | 1,000 ops/sec | <50 ms | Go / Java |
| Mid-tier ($1-50M/day) | 10,000 ops/sec | <5 ms | Go / Rust |
| Large ($50M+/day) | 100,000+ ops/sec | <500 µs | C++ / Rust |
Order Book имплементация
use std::collections::BTreeMap;
use std::collections::VecDeque;
type Price = u64; // Integer representation: price * 10^8
type Quantity = u64;
#[derive(Debug, Clone)]
struct Order {
id: u64,
price: Price,
quantity: Quantity,
remaining: Quantity,
side: Side,
order_type: OrderType,
timestamp: u64,
user_id: u64,
}
#[derive(Debug)]
struct PriceLevel {
price: Price,
total_quantity: Quantity,
orders: VecDeque<u64>, // order IDs в порядке времени
}
struct OrderBook {
symbol: String,
bids: BTreeMap<std::cmp::Reverse<Price>, PriceLevel>,
asks: BTreeMap<Price, PriceLevel>,
orders: std::collections::HashMap<u64, Order>,
}
impl OrderBook {
fn match_order(&mut self, incoming: &mut Order) -> Vec<Trade> {
let mut trades = Vec::new();
let opposite_side = match incoming.side {
Side::Buy => &mut self.asks,
Side::Sell => &mut self.bids,
};
while incoming.remaining > 0 {
let best_level = match incoming.side {
Side::Buy => opposite_side.iter_mut().next(),
Side::Sell => opposite_side.iter_mut().next(),
};
match best_level {
None => break,
Some((_, level)) => {
let price_matches = match incoming.side {
Side::Buy => incoming.price >= level.price,
Side::Sell => incoming.price <= level.price,
};
if !price_matches { break; }
while incoming.remaining > 0 && !level.orders.is_empty() {
let maker_id = *level.orders.front().unwrap();
let maker = self.orders.get_mut(&maker_id).unwrap();
let fill_qty = incoming.remaining.min(maker.remaining);
trades.push(Trade {
maker_order_id: maker_id,
taker_order_id: incoming.id,
price: level.price,
quantity: fill_qty,
});
incoming.remaining -= fill_qty;
maker.remaining -= fill_qty;
if maker.remaining == 0 {
level.orders.pop_front();
self.orders.remove(&maker_id);
}
}
}
}
}
trades
}
}
Matching engine на Rust обрабатывает в 3 раза больше операций, чем аналогичный на Python. Мы используем Event Sourcing — все изменения состояния записываются как неизменяемая последовательность событий (OrderPlaced → OrderMatched → TradeFilled → OrderCancelled). Это даёт полный audit trail и возможность восстановления после краха, что признано лучшей практикой в высоконагруженных системах. Для mid-tier биржи экономия на инфраструктуре за счёт правильной архитектуры может быть значительной. Дополнительно, для проектов с объёмом торгов $1M/day мы снижаем затраты на KYC-интеграцию.
Как обеспечивается безопасность кастодиальной системы
Биржа хранит средства пользователей. Мы реализуем многоуровневую защиту:
- Multi-sig cold storage: 95%+ средств в холодных кошельках с 3-of-5 multisig. Ключи физически разнесены по разным дата-центрам и странам. Используем HSM (Hardware Security Modules) для подписания.
- Hot wallet: 2-5% средств для оперативных выводов с автоматическим пополнением из cold. Суточный лимит вывода превышает который требует ручного одобрения.
- Withdrawal security: каждый вывод проверяется на whitelist адресов, velocity, AML-скрининг (Chainalysis, Elliptic). Сомнительные транзакции уходят на manual review.
Детали реализации кастодиальной защиты
Для подписания транзакций используем HSM с ключами, разделёнными по принципу sharded secret. Каждая транзакция требует подтверждения от 3 из 5 ключей. Данные о балансах хранятся в отдельной базе с шифрованием на уровне строк.KYC/AML и compliance
Таблица уровней верификации:
| KYC Level | Данные | Дневной лимит |
|---|---|---|
| 0 — Email | Только email | 0 (только просмотр) |
| 1 — Basic | Телефон + страна | $500 |
| 2 — Standard | ID + Selfie | $10,000 |
| 3 — Enhanced | Proof of address + source of funds | $100,000 |
| Institutional | Корпоративные документы | Unlimited |
Интегрируем Sumsub или Onfido через REST API. Webhook при изменении статуса верификации. AML-скрининг каждого депозита и вывода в реальном времени.
Рыночные данные и интеграция TradingView
Real-time feeds
Matching Engine → Trade Events → Kafka
│
┌──────────┤
▼ ▼
OHLCV Builder Order Book Aggregator
│ │
└────┬─────┘
▼
WebSocket Broadcaster
(horizontal scaling)
│
┌─────────┼─────────┐
▼ ▼ ▼
Client 1 Client 2 Client N
WebSocket сервер публикует diff updates (дельта-изменения), что снижает трафик в 10-50 раз. Для профессионального trading terminal интегрируем TradingView Advanced Charts через UDF data feed и WebSocket.
Процесс работы над проектом
- Аналитика: исследование рынка, требования, выбор стека, экономика проекта.
- Проектирование: архитектура, прототип matching engine, спецификация API.
- Реализация: разработка всех модулей, написание смарт-контрактов (если нужны) на Solidity или Rust.
- Тестирование: unit, integration, load testing (до 50k ops/sec). Безопасность — аудит смарт-контрактов и pen test.
- Деплой: настройка инфраструктуры, мониторинг, запуск в продакшн. Обеспечение ликвидности через ботов или market makers.
Что входит в работу
- Документация (архитектурная, API, deployment)
- Исходный код с тестами
- CI/CD pipeline
- Доступы к инфраструктуре
- Обучение команды
- Поддержка 3 месяца после запуска
Сроки: от 12 до 24 месяцев в зависимости от функционала. Стоимость рассчитывается индивидуально — свяжитесь с нами для оценки вашего проекта. Мы подготовим детальную смету и roadmap. Типичный проект обходится заказчику в диапазоне, который мы обсуждаем индивидуально — но экономия на инфраструктуре за счёт правильной архитектуры может достигать 40% по сравнению с типовыми решениями. Мы разработали уже 5+ бирж и знаем все подводные камни. Получите консультацию по вашему проекту — оценим и предложим оптимальное решение.







