19:43:03, отпечаток условий 6b72 a149
Условия на виду до старта
Организатор пишет приз, срок приёма и число победителей. Как только он запускает розыгрыш, условия уходят в открытый журнал. Вместе с ними записан номер будущего числа сети drand: по нему и выберут победителя.
Открытый журнал ведём не мы. Запись в нём получает время и номер, и переписать её потом нельзя: любой, кто сохранил её раньше, увидит разницу.
- Что выкладываем
- условия розыгрыша и номер будущего числа
- Где проверить
- в открытом журнале и в нашем канале отметок
Технически: отпечаток условий в Sigstore Rekor
1 000 записей, код списка 98ed 874e
Список закрыт и опубликован
Участники входят в одно касание: на стриме через VK Видео Live, в акции компании через её сайт или приложение. Каждый сразу получает квитанцию: номер записи и время. Имя в журнал не пишется, только код аккаунта.
Когда приём закрыт, список целиком становится одним коротким кодом и уходит в тот же открытый журнал. Если потом добавить, убрать или поменять запись, код станет другим, а прежний уже хранится у третьих лиц.
- Что выкладываем
- код списка участников и число записей
- Где проверить
- в открытом журнале, через несколько секунд после закрытия
Технически: корень дерева Меркла списка в Sigstore Rekor
вышло в 19:46:24, подпись сети сошлась
Число приходит со стороны
Случайное число выпускает сеть drand. Её ведут независимые друг от друга организации. Раз в три секунды выходит новое число, и его подписывает вся сеть. Номер нужного числа стоит в условиях с самого начала, а само число до выхода не знает никто, мы тоже.
Номер выбирают так, чтобы число вышло уже после закрытия приёма: на стриме примерно через 70 секунд, в акции компании не раньше чем через 5 минут.
- Что выкладываем
- номер числа drand, назначенный в условиях
- Где проверить
- у любого зеркала сети drand
Технически: раунд сети drand quicknet, подпись BLS
победители: записи № 748, 910, 444, пересчитано за 50 мс
Каждый пересчитает сам
Номер победившей записи считает формула из условий: в неё входят число drand и наше секретное число. Формула открыта. Страница проверки повторяет расчёт на телефоне участника и сверяет условия и список с тем, что лежит в журнале.
Если всё сошлось, сверху стоит Совпало. Если записанное поменяли, страница скажет Не совпало и покажет, в какой строке.
Открытый журнал иногда отвечает с опозданием. Тогда после выхода числа страница ещё 10 минут ждёт отметку закрытия и пишет Ожидание. Если отметки, сделанной до выхода числа, так и нет, сверху будет Нет внешней отметки до раунда. Что тогда с итогом, сказано в условиях до старта: на стриме он принимается, в акции компании розыгрыш не состоялся. А если розыгрыш сорвался по правилам условий, страница пишет Не состоялся.
- Что выкладываем
- секретное число, победителей и подпись сервиса
- Где проверить
- на странице проверки и утилитой на Python
Технически: формула draw-v1, PROTOCOL.md §12
Как список становится одним кодом
Из каждой записи получается короткий код. Коды склеиваются попарно, пока не останется один: это и есть код списка. Поменяйте одну запись, и поменяется весь путь до верха. Чтобы доказать, что запись 4 в списке, хватает её самой, соседней записи и кода пары 1 и 2: так страница проверки находит участника по квитанции.
Почему мы тоже не можем подкрутить
В расчёт входит наше секретное число. Его код мы публикуем до начала приёма, а само число раскрываем после выхода числа drand. Подобрать его под нужного победителя уже нельзя: код не сойдётся, и страница проверки это покажет.
Дописать участников после выхода числа сервис мог бы, только если закрытие не отмечено снаружи вовремя. Тогда страница не напишет Совпало.
Знать исход заранее мог бы только тот, кто одновременно управляет нашим сервисом и большинством узлов сети drand.
Чего проверка не ловит
- Журнал доказывает, что записанное не меняли, но не знает о событиях, которых ему не прислали. Для этого у участника квитанция: если её записи нет в списке, видно, что запись приняли и не включили.
- Квитанция говорит, что запись принята, но не говорит, чья она: запись одна на аккаунт площадки, а не на человека.
- Отметку, которую сервис придержал. Сервис может отметить закрытие до выхода числа, не положить эту отметку в файлы и уже после итога решить, класть ли её. Без неё страница через 10 минут напишет Нет внешней отметки до раунда, а в акции компании это отменит розыгрыш. Найти такую отметку можно, только просмотрев все записи открытого журнала с ключом сервиса, а страница проверки этого не делает.
- Вручение приза. Приз выдаёт организатор, мы его не проверяем.
- Страницу проверки отдаёт наш сервер. Совсем независимая проверка это утилита на Python из открытого кода и копия страницы у площадки.
Полный список с мерами в протоколе, раздел 21. Протокол
Проверить свой розыгрыш
Номер розыгрыша есть в квитанции и в ссылке от организатора.