Когда мы проектировали розыгрыши, первый вопрос был не технический, а человеческий: как участник может знать, что всё честно? Доверие на слово — не ответ. Поэтому мы выбрали другой путь: сделать процесс выбора победителя проверяемым независимо от нас.
Непредсказуемость
Никто — включая нас — не знает победителя до проведения розыгрыша
Неизменяемость
Результат зафиксирован публично до розыгрыша и не может быть подменён
Воспроизводимость
Любой может пересчитать результат самостоятельно из публичных данных
Как определяется победитель
Фиксируем «обязательство» до розыгрыша
Когда розыгрыш публикуется, сервер генерирует случайное число — seed — длиной 256 бит. Публикуем его криптографический отпечаток: SHA-256(seed). По отпечатку восстановить seed невозможно, но после розыгрыша можно убедиться: раскрытый seed соответствует именно тому отпечатку.
Замораживаем список участников
За 2 часа до розыгрыша список замораживается. Любое изменение изменит криптографический отпечаток списка — это будет заметно при проверке. Количество участников и отпечаток публикуются в ВКонтакте — публично и с независимым timestamp.
Автоматический розыгрыш
Алгоритм объединяет seed и список через функцию HMAC-SHA256. При нескольких призовых местах процедура повторяется, каждый раз исключая уже выбранных. Человек в этом процессе не участвует.
Раскрываем все данные
После розыгрыша публикуем раскрытый seed в ВКонтакте. Страница верификации позволяет убедиться в результате без единой строки кода — прямо в браузере.
Что публикуется и когда
| Момент | Что публикуем в ВКонтакте | Зачем |
|---|---|---|
| При публикации | Отпечаток seed (SHA-256) | Фиксируем обязательство до первого участника |
| За 2 часа | Отпечаток списка + количество участников | Список нельзя изменить незаметно |
| После розыгрыша | Раскрытый seed + хэши победителей | Позволяем самостоятельно пересчитать результат |
Пост в ВКонтакте публичен и независим от нас: мы не контролируем его timestamp. Если пост редактировался — ВКонтакте показывает пометку «изменено». Задним числом выпустить пост с нужной датой невозможно.
Как проверить своё участие
🔐 С логином
В личном кабинете видны все данные: ваш хэш, подтверждение включения в список, результат розыгрыша и кнопка для запуска верификации прямо в браузере.
👁 Без логина
На странице розыгрыша можно найти себя по имени или никнейму в открытом списке. Личные данные при этом не раскрываются — в списке только хэши.
Как проверить результат самостоятельно
После розыгрыша все данные для проверки публичны. Мы публикуем скрипт верификации и данные в открытом доступе — чтобы проверка была возможна без нашего сайта.
Под капотом: для тех, кто хочет разобраться глубже
Почему HMAC-SHA256, а не обычный рандом
HMAC-SHA256 — это криптографическая псевдослучайная функция (PRF). При неизвестном seed результат вычислительно неотличим от истинно случайного числа. Это не просто «хорошая случайность» — это математически доказанное свойство, лежащее в основе банковских систем.
Почему seed генерируется до списка участников
Если бы мы генерировали seed уже зная список, можно было бы перебирать варианты до нужного результата. Поэтому seed фиксируется при публикации, до начала регистрации. Даже теоретически: пространство seed-ов составляет 2²⁵⁶ вариантов — на перебор ушло бы больше времени, чем существует вселенная.
Равные шансы для каждого участника
P(участник i победит) = K / N, где K — количество призовых мест, N — участников. Одинаково для всех. Алгоритм работает только с позицией участника в отсортированном списке хэшей — не с именем или личными данными.
Результаты испытаний
Мы провели 100 000 симулированных розыгрышей для каждого сценария. Тесты запускались в Google Colab — открытой облачной среде. Notebook для самостоятельного воспроизведения доступен для скачивания выше.
Как читать p-value
χ²-тест — стандартный статистический критерий равномерности. p-value показывает: насколько вероятно получить такое или более «неровное» распределение при идеально честном алгоритме. При p > 0.01 — распределение статистически равномерное. Оба наших теста прошли.
Наш подход к прозрачности
Мы выбрали открытость не потому что обязаны, а потому что считаем это правильным. Участник, который понимает как работает система, имеет возможность убедиться в честности самостоятельно — не полагаясь на наши заверения.
Мы честно признаём: техническая прозрачность решает задачу проверяемости алгоритма, но не устраняет необходимость базового доверия к платформе. Мы описываем наш подход и публикуем данные — проверить их корректность каждый может сам.
Вопросы по алгоритму или замечания — через раздел поддержки.