4.8 KiB
4.8 KiB
Архитектура VK Giveaway Randomizer
1. Обзор архитектуры
Система построена по принципам чистой архитектуры (Clean Architecture / Hexagonal Architecture) с разделением на независимые слои:
graph TD
UI[Frontend UI: Next.js App Router] --> API[Next.js API Routes / Server Actions]
API --> Core[Core Domain Layer: Randomizer & Filtering]
API --> Providers[Social Providers Layer: VK / Telegram / YouTube]
API --> DB[(Database: PostgreSQL + Prisma)]
Providers --> VK[Official VK API / VK Mock]
2. Слои приложения
2.1. Core Domain Layer (src/core/)
Ядро приложения не зависит от конкретной социальной сети или веб-фреймворка:
src/core/randomizer/:deterministic.ts: Реализация детерминированного генератора случайных чисел (PRNG) и перетасовки Фишера-Йетса с использованием криптографических хешей (SHA-256 HMAC).hasher.ts: Генерация фиксированного отпечатка (Snapshot Hash) списка участников перед розыгрышем.
src/core/filtering/:filter-engine.ts: Механизм фильтрации участников на основе заданных условий (лайк, репост, коммент, подписка, черный список ID, исключение админов, дедупликация).
src/core/types/:- Типизированные контракты сущностей (
Giveaway,Participant,DrawResult,AuditRecord,FilterRules).
- Типизированные контракты сущностей (
2.2. Social Providers Layer (src/providers/)
Абстракция взаимодействия с внешними платформами:
SocialMediaProvider(Interface):fetchPost(url: string): Получение метаданных публикации (автор, текст, превью, счетчики).fetchParticipants(params: FetchParticipantsParams): Загрузка списка участников (лайки, комменты, репосты).checkSubscription(userIds: string[], groupId: string): Проверка подписки на сообщество.
VkProvider: Боевой клиент к VK API с поддержкой пакетных запросовexecute.VkMockProvider: Тестовый провайдер для демонстрации, локальной разработки и оффлайн-тестирования.ProviderRegistry: Фабрика для получения провайдера по типу платформы (vk,telegram,youtube).
2.3. Data & Persistence Layer (prisma/ + src/lib/)
- PostgreSQL в качестве надежного реляционного хранилища.
- Prisma ORM для типобезопасной работы с БД.
- Хранение всех розыгрышей, снапшотов участников и записей аудита для публичной верификации.
2.4. Presentation Layer (src/app/ + src/components/)
- Modern React + Next.js App Router.
- Интерактивный визард создания розыгрыша с живым превью поста, настройкой условий, интерактивной таблицей участников и презентацией победителей.
3. Механизм честности и доказуемости (Provably Fair)
Каждый розыгрыш формирует криптографический аудит-след:
- Снапшот участников: Список прошедших фильтрацию (eligible) участников сортируется по
platformUserIdи хешируется через SHA-256:\text{ParticipantsHash} = \text{SHA256}(\text{JSON}(\text{sortedEligibleParticipants})) - Seed розыгрыша: Пользовательский или сгенерированный криптографически стойкий seed.
- Детерминированный выбор:
- Для каждого шага выбора индекса вычисляется:
\text{Hash}_i = \text{HMAC-SHA256}(\text{seed} + ":" + i, \text{ParticipantsHash}) - Индекс победителя определяется детерминированно из полученного хеша.
- Для каждого шага выбора индекса вычисляется:
- Результат: Зная
ParticipantsHashиseed, любой внешний наблюдатель может воспроизвести выбор и убедиться в честности результата на 100%.