You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Платформа представляет собой полный стек аукционов, разложенный на несколько Node-сервисов. Движок аукционов и журнал операций спроектированы детерминированно и идемпотентно. Крипто-шлюз соединяет депозиты и выводы со внешними наблюдателями и сервисами подписи.
Стек рассчитан на плотную конкуренцию ставок: быстрый для пользователя и железобетонный для денег.
Ключевые принципы
Все операции, двигающие деньги, пишутся в журнал только на добавление
Любое видимое клиенту состояние выводится из каноничных записей MongoDB и безопасно кэшируется в Redis
Все переходы состояния идемпотентны и безопасны к повторным попыткам
ML-система детектирует аномальные выводы в реальном времени
Гарантии и свойства
Гарантия
Описание
Детерминированность
Одинаковые входные данные дают одинаковые итоги и ранжирование
Идемпотентность
Повторный запрос не приводит к повторному списанию или hold
Полный аудит
Журнал append-only позволяет восстановить историю по шагам
Проверяемость
Подписи раундов и Merkle-корни дают независимую верификацию
Безопасная конкуренция
Распределённые блокировки и лимиты исключают гонки
Устойчивость к сбоям
Кэши и снапшоты помогают пересинхронизироваться
Изоляция доменов
Сбой отдельного сервиса не ломает весь расчётный контур
Детерминированные правила разруливания равных ставок
Предсказуемые итоги
⏱️ Антиснайпинг
Умные продления финала
Жёсткие лимиты на количество продлений
Защита от пинг-понга
🤖 Прокси-ставки
Максимум в эскроу
Авто-повышение по шагу
Прозрачная логика победы
💰 Ledger-first финансы
Блокировки, списания и возвраты фиксируются append-only
Легко аудируемые операции
Идемпотентность всех денежных операций
🚀 Высокая производительность
Redis Fast Path: 2000-5000 RPS
WebSocket Turbo Mode: 3-5ms латентность
Фоновая синхронизация в MongoDB
🤖 ML Детектор аномалий
Адаптивное обучение на поведении пользователей
Многофакторная оценка рисков
Автоматическая блокировка подозрительных выводов
🔌 Интеграции
GraphQL API с подписками
Webhook уведомления с HMAC подписями
TypeScript SDK для клиентских приложений
OpenAPI/Swagger документация
AsyncAPI для WebSocket событий
🎛️ Feature Flags
Динамическое управление функциями
Персонализация для пользователей
A/B тестирование
Ключевые механики
flowchart TD
subgraph "Многораундовая система"
A[🎁 Аукцион: 100 лотов] --> B[Раунд 1: 30 лотов]
B --> C[Раунд 2: 40 лотов]
C --> D[Раунд 3: 30 лотов]
end
subgraph "Логика раунда"
B --> E{Топ-30 ставок}
E -->|Победители| F[💰 Списание средств]
E -->|Остальные| G[↩️ Перенос в Раунд 2]
end
style A fill:#4CAF50,color:#fff
style F fill:#2196F3,color:#fff
style G fill:#FF9800,color:#fff
Loading
Основные принципы
Механика
Описание
Одна ставка на аукцион
Конкурентные ставки сериализуются и остаются прозрачными
Многораундовое распределение
Каждый раунд выбирает победителей, остальные переходят дальше
Тайминги раундов
scheduled → live → closed с антиснайпинг-окнами
Антиснайпинг
Ставки в последнем окне продлевают раунд с лимитами
stateDiagram-v2
[*] --> scheduled: Создание аукциона
scheduled --> live: Время старта
live --> extended: Ставка в anti-sniping окне
extended --> live: Продление завершено
live --> closed: Время окончания
extended --> closed: Лимит продлений
closed --> finalized: Расчёт победителей
finalized --> [*]: Все раунды завершены
note right of extended
Максимум продлений
ограничен конфигурацией
end note
note right of finalized
Победители: списание
Остальные: перенос/возврат
end note
Loading
Архитектура системы
flowchart TB
subgraph "Клиенты"
WEB[🌐 Web UI]
TG[📱 Telegram Bot]
API[🔌 External API]
SDK[📦 TypeScript SDK]
end
subgraph "Gateway Layer"
WEBSERV[Web Service<br/>:4005]
BOT[Bot Service<br/>:4004]
end
subgraph "API Layer"
GQL[GraphQL API]
REST[REST API]
WS[WebSocket]
WEBHOOK[Webhook Dispatcher]
end
subgraph "Core Services"
AE[⚙️ Auction Engine<br/>:4001]
LED[📒 Ledger<br/>:4002]
CG[💳 Crypto Gateway<br/>:4003]
WORK[⏰ Workers<br/>:4006]
end
subgraph "Intelligence Layer"
ML[🤖 ML Anomaly Detector]
FF[🎛️ Feature Flags]
end
subgraph "Crypto Layer"
SIGN[🔐 Signer<br/>:4007]
MOCK[🎭 Mock RPC<br/>:9000]
end
subgraph "Storage Layer"
MONGO[(MongoDB<br/>Replica Set)]
REDIS[(Redis<br/>Pub/Sub + Cache)]
end
WEB --> WEBSERV
TG --> BOT
API --> AE
SDK --> REST
WEBSERV --> GQL
WEBSERV --> REST
WEBSERV --> WS
GQL --> AE
REST --> AE
WS --> AE
WORK --> WEBHOOK
AE --> MONGO
AE --> REDIS
LED --> MONGO
CG --> ML
CG --> SIGN
FF --> REDIS
ML --> REDIS
style AE fill:#4CAF50,color:#fff
style LED fill:#2196F3,color:#fff
style CG fill:#9C27B0,color:#fff
style GQL fill:#E10098,color:#fff
style ML fill:#FF5722,color:#fff
erDiagram
AUCTION ||--o{ ROUND : contains
ROUND ||--o{ BID : contains
USER ||--o{ BID : places
USER ||--o{ LEDGER_ENTRY : has
AUCTION ||--o{ WINNER : determines
USER ||--o{ WEBHOOK : configures
AUCTION {
ObjectId id PK
string title
string currency
string pricingMode
Date startsAt
Date endsAt
int totalItems
object antiSnipingConfig
string status
}
ROUND {
ObjectId id PK
ObjectId auctionId FK
int roundNumber
int itemsToDistribute
Date startsAt
Date endsAt
string status
string merkleRoot
string signature
decimal cutoffPrice
}
BID {
ObjectId id PK
ObjectId auctionId FK
ObjectId roundId FK
string userId
decimal amount
Date createdAt
string idempotencyKey UK
string origin
}
WEBHOOK {
ObjectId id PK
string userId FK
string url
string secret
array events
boolean active
}
Loading
Ключевые сценарии
Размещение ставки (Fast Path)
sequenceDiagram
autonumber
participant Client as 🌐 Клиент
participant Web as Web Service
participant Redis as Redis (Lua)
participant Mongo as MongoDB (async)
Client->>Web: POST /api/auctions/:id/bid
Web->>Redis: EVAL fastBid.lua
Note over Redis: Атомарно за 2-3ms:<br/>1. Проверка идемпотентности<br/>2. Проверка баланса<br/>3. Обновление баланса<br/>4. Добавление в рейтинг<br/>5. Очередь на синхронизацию
Redis-->>Web: OK + rank
Web-->>Client: 201 Created (3-5ms)
Web->>Redis: PUBLISH new-bid
Redis-->>Client: WS: bid-placed event
Note over Mongo: Фоновая синхронизация<br/>каждые 1-2 секунды
Redis->>Mongo: Batch INSERT bids
Loading
Финализация раунда с Cutoff Pricing
sequenceDiagram
autonumber
participant Scheduler as ⏰ Scheduler
participant Engine as Auction Engine
participant Ledger as Ledger
participant Webhook as Webhook Dispatcher
Scheduler->>Engine: Round end trigger
Engine->>Engine: Получить топ N+1 ставок
Engine->>Engine: Определить cutoff price
loop Для каждого победителя
Engine->>Engine: finalPrice = min(bid, cutoff)
Engine->>Ledger: capture(holdId, finalPrice)
Engine->>Ledger: release(holdId, bid - finalPrice)
end
Engine->>Engine: Compute Merkle root
Engine->>Engine: Sign round results
Engine->>Webhook: Dispatch round_complete
Webhook->>Webhook: HMAC sign payload
Webhook-->>External: POST webhook URL
Loading
Быстрый старт
Требования
Node.js 20+
Docker & Docker Compose
Git
Установка и запуск
# 1. Клонирование репозитория
git clone https://github.com/germanProgq/crypto-hackathon.git
cd crypto-hackathon
# 2. Установка зависимостей
npm install
# 3. Создание .env файла
cat > .env << 'EOF'CORE_API_TOKEN=dev-token-12345MONGODB_URI=mongodb://localhost:27017/crypto-auction?directConnection=trueREDIS_URL=redis://localhost:6379NODE_ENV=developmentWEB_ALLOW_DEMO_USER=trueEOF# 4. Запуск инфраструктуры
docker compose up -d mongo redis
# 5. Запуск сервисов
npm run dev:auction-engine &
npm run dev:ledger &
npm run dev:web &
npm run dev:workers &# 6. Открыть Web UI
open http://localhost:4005
✅ ML Anomaly Detection — обнаружение подозрительных операций
✅ HMAC Webhooks — криптографическая подпись
Конфигурация
Основные переменные
Переменная
Описание
По умолчанию
NODE_ENV
Окружение
development
CORE_API_TOKEN
Токен межсервисной авторизации
—
MONGODB_URI
MongoDB connection string
—
REDIS_URL
Redis connection string
—
Производительность
Переменная
Описание
По умолчанию
BID_MODE
safe / fast / auto
auto
BID_FAST_SYNC_INTERVAL_MS
Интервал синхронизации
1000
BID_FAST_SYNC_BATCH_SIZE
Размер батча
100
ML Детектор
Переменная
Описание
По умолчанию
ML_ANOMALY_THRESHOLD
Порог для review
50
ML_AMOUNT_WEIGHT
Вес суммы
40
ML_NEW_ADDRESS_WEIGHT
Вес нового адреса
25
ML_FREQUENCY_WEIGHT
Вес частоты
30
Нагрузочное тестирование
Результаты
Метрика
Safe Path
Fast Path
Throughput
~80 RPS
2000-5000 RPS
Latency p50
45ms
8ms
Latency p99
120ms
25ms
Запуск тестов
npm run load:all # Полный набор
npm run load:stress # Стресс-тест ставок
npm run load:bot # Симуляция ботов
npm run load:anti-sniping # Тест anti-sniping
npm run load:reconcile # Финансовая корректность
Деплой
Railway
# Установка CLI
npm i -g @railway/cli
# Авторизация
railway login
# Деплой
railway up