Протокол
Эта страница для юристов и комплаенса. Полная спецификация для разработчиков и проверяющих лежит рядом, вместе с тестовыми векторами.
Что уходит наружу и куда
| Момент | Что уходит наружу | Куда |
|---|---|---|
| Фиксация условий | Отпечаток условий, отпечаток секретного числа, номер раунда drand | Rekor, канал, файлы розыгрыша |
| Каждая запись | Номер записи, время, отпечаток участника; квитанция с подписью сервиса | Квитанция у участника, файлы розыгрыша |
| Закрытие приёма | Корень списка, число записей, время закрытия | Rekor и канал в течение 10 секунд |
| Выход раунда | Число drand с подписью сети | Зеркала drand |
| Итог | Секретное число, победители и запасные, подпись сервиса | Файлы розыгрыша, общий журнал, Rekor |
Что это доказывает
- Условия не менялись с момента фиксации.
- Список участников не менялся с момента закрытия приёма.
- Случайное число не выбирала ни одна из сторон: его дала сеть drand в раунде, назначенном заранее.
- Победитель посчитан по опубликованной формуле, и расчёт можно повторить.
- Каждая квитанция подтверждает свою запись в журнале.
Чего не доказывает
- Что организатор передал все события участия. Это закрывают квитанции: участник, не нашедший свою запись, предъявляет квитанцию.
- Что программа организатора совпадает с описанными условиями.
- Кто стоит за записью: одна запись положена на аккаунт площадки, а не на человека.
- Что приз вручён. Приз выдаёт организатор.
Кто что делает
- Организатор
- Площадка, бренд или стример. Задаёт условия, присылает события участия, выдаёт приз.
- Сервис
- Фиксирует условия, ведёт журнал, хранит секретное число до итога, публикует отметки и файлы розыгрыша.
- Сеть drand
- Выпускает случайное число раз в три секунды и подписывает его.
- Rekor
- Открытый журнал проекта Sigstore. Наши отметки получают там номер и время, которые мы не выбираем.
- Участник
- Хранит квитанцию, проверяет итог на странице проверки или утилитой.
Формула словами
На вход идут номер розыгрыша, номер и подпись раунда drand, секретное число сервиса, корень списка участников и число мест в розыгрыше. Всё это записывается в каноническом виде и пропускается через SHA-256, из результата получается поток блоков.
Из каждого блока берётся равномерное число от нуля до числа свободных мест. Первое число выбирает место победителя, следующие выбирают следующих победителей и запасных. Если в условиях стоит один приз на участника, все места этого участника выбывают. Каждый шаг расчёта лежит в тестовых векторах.
Что мы храним и что нет
В журнал розыгрыша попадает отпечаток идентификатора участника на площадке, посчитанный с солью розыгрыша. Соль хранится у сервиса и наружу не выходит. Технически мы можем сопоставить запись с аккаунтом площадки, но не публикуем это сопоставление и не передаём площадке.
Имени, почты и телефона участника у нас нет. Суммы донатов и тексты сообщений не записываются. Журнал, отметки и файлы розыгрышей открыты и не стираются: на них держится проверка.
Как читать запись в Rekor
У каждой отметки есть номер записи в Rekor. Внутри записи лежат отпечаток нашего журнала на этот момент и наша подпись, а Rekor добавляет время, когда принял запись. Это время и есть момент отметки: если закрытие отмечено раньше выхода раунда drand, список не могли дописать, зная число.
Этот корень стоит в журнале отметок на главной и на странице проверки розыгрыша. Его первые знаки можно сравнить глазами, а страница проверки сверяет запись целиком.
Спецификация и векторы
- Протокол проверяемых розыгрышей, версия 1, PROTOCOL.md
- Тестовые векторы: входы и ответы для каждого шага, чтобы проверить свою реализацию
- Журнал отметок