Фиксация списка
Участники проходят проверку условий и получают порядковые номера. Список хешируется — его нельзя изменить незаметно.
Коротко: заранее фиксируем список, публикуем обязательство, после розыгрыша раскрываем seed. Результат воспроизводится математически.
Участники проходят проверку условий и получают порядковые номера. Список хешируется — его нельзя изменить незаметно.
Мы создаём случайный seed и публикуем SHA-256(seed). До розыгрыша никто не знает seed, но все видят его отпечаток.
Для каждого участника считается HMAC-SHA256(seed, id). Побеждают первые N по возрастанию хеша.
Публикуем seed и протокол. Любой может пересчитать результат на странице проверки.
// 1. Список фиксируется до жеребьёвки
const listHash = sha256(entries.map(e => e.id).sort().join("\n"));
// 2. Обязательство публикуется заранее
const seed = randomHex(16);
const commit = sha256(seed); // публикуем commit
// 3. Победитель — функция от seed и id участников
const scored = entries.map(e => ({
id: e.id,
score: hmacSha256(seed, e.id)
}));
scored.sort((a, b) => a.score < b.score ? -1 : 1);
const winners = scored.slice(0, N);
// 4. После розыгрыша публикуем seed
// любой может повторить шаг 3 и получить тех же победителей
Изменить список после публикации обязательства нельзя: хеш не совпадёт. Подменить seed нельзя: он должен давать опубликованный SHA-256. Выбрать «удобного» победителя нельзя: результат — функция от seed и id.
Мы честно пишем, что проверяем автоматически, а что берём со слов блогера: подписку в Telegram и ВКонтакте проверяет API, подписку в YouTube — никто.
| Площадка | Комментарии | Подписка |
|---|---|---|
| ВКонтакте | Автоматически | Автоматически |
| Telegram | Только вперёд | Автоматически |
| YouTube | Автоматически | Невозможно |
| RuTube | Вручную | Невозможно |
| Свой список | Вручную | Заявлено блогером |