Разделы

Протокол

Эта страница для юристов и комплаенса. Полная спецификация для разработчиков и проверяющих лежит рядом, вместе с тестовыми векторами.

Что уходит наружу и куда

МоментЧто уходит наружуКуда
Фиксация условийОтпечаток условий, отпечаток секретного числа, номер раунда drandRekor, канал, файлы розыгрыша
Каждая записьНомер записи, время, отпечаток участника; квитанция с подписью сервисаКвитанция у участника, файлы розыгрыша
Закрытие приёмаКорень списка, число записей, время закрытияRekor и канал в течение 10 секунд
Выход раундаЧисло drand с подписью сетиЗеркала drand
ИтогСекретное число, победители и запасные, подпись сервисаФайлы розыгрыша, общий журнал, Rekor

Что это доказывает

  • Условия не менялись с момента фиксации.
  • Список участников не менялся с момента закрытия приёма.
  • Случайное число не выбирала ни одна из сторон: его дала сеть drand в раунде, назначенном заранее.
  • Победитель посчитан по опубликованной формуле, и расчёт можно повторить.
  • Каждая квитанция подтверждает свою запись в журнале.

Чего не доказывает

  • Что организатор передал все события участия. Это закрывают квитанции: участник, не нашедший свою запись, предъявляет квитанцию.
  • Что программа организатора совпадает с описанными условиями.
  • Кто стоит за записью: одна запись положена на аккаунт площадки, а не на человека.
  • Что приз вручён. Приз выдаёт организатор.

Кто что делает

Организатор
Площадка, бренд или стример. Задаёт условия, присылает события участия, выдаёт приз.
Сервис
Фиксирует условия, ведёт журнал, хранит секретное число до итога, публикует отметки и файлы розыгрыша.
Сеть drand
Выпускает случайное число раз в три секунды и подписывает его.
Rekor
Открытый журнал проекта Sigstore. Наши отметки получают там номер и время, которые мы не выбираем.
Участник
Хранит квитанцию, проверяет итог на странице проверки или утилитой.

Формула словами

На вход идут номер розыгрыша, номер и подпись раунда drand, секретное число сервиса, корень списка участников и число мест в розыгрыше. Всё это записывается в каноническом виде и пропускается через SHA-256, из результата получается поток блоков.

Из каждого блока берётся равномерное число от нуля до числа свободных мест. Первое число выбирает место победителя, следующие выбирают следующих победителей и запасных. Если в условиях стоит один приз на участника, все места этого участника выбывают. Каждый шаг расчёта лежит в тестовых векторах.

Что мы храним и что нет

В журнал розыгрыша попадает отпечаток идентификатора участника на площадке, посчитанный с солью розыгрыша. Соль хранится у сервиса и наружу не выходит. Технически мы можем сопоставить запись с аккаунтом площадки, но не публикуем это сопоставление и не передаём площадке.

Имени, почты и телефона участника у нас нет. Суммы донатов и тексты сообщений не записываются. Журнал, отметки и файлы розыгрышей открыты и не стираются: на них держится проверка.

Как читать запись в Rekor

У каждой отметки есть номер записи в Rekor. Внутри записи лежат отпечаток нашего журнала на этот момент и наша подпись, а Rekor добавляет время, когда принял запись. Это время и есть момент отметки: если закрытие отмечено раньше выхода раунда drand, список не могли дописать, зная число.

Этот корень стоит в журнале отметок на главной и на странице проверки розыгрыша. Его первые знаки можно сравнить глазами, а страница проверки сверяет запись целиком.

Спецификация и векторы