Броски, которые можно проверить
Проверьте броски партии
Когда партия или матч окончены, нажмите на печать в карточке результата, затем «Проверить броски». Эта страница откроется с уже заполненными полями, и ваш браузер пересчитает печать и каждый бросок, никуда не отправляя данные партии.
Как вычисляется бросок
Один и тот же код работает в приложении и на сервере, а на этой странице работает его копия. Каждый бросок матча получается из одного HMAC:
mac = HMAC-SHA256(ключ = байты зерна сервера,
сообщение = зерноТелефона1 ":" зерноТелефона2 ":" номерБроска)
байт = первый байт mac, который меньше 252
v = байт mod 36
кубики = (floor(v / 6) + 1, v mod 6 + 1)
252 = 7 × 36, поэтому каждый из 36 упорядоченных бросков равновероятен. Байты от 252 до 255 пропускаются: если бы их оставили, первые четыре комбинации выпадали бы чуть чаще. Если ни один из 32 байтов не меньше 252 (вероятность около 2-192, слишком малая, чтобы этого ждать), к части с зёрнами телефонов добавляется + и MAC вычисляется снова: зерноТелефона1:зерноТелефона2+:номерБроска, затем ++ и так далее.
Печать, которую вы видите до первого броска, равна SHA-256(байты зерна сервера) в шестнадцатеричной записи. Зерно сервера занимает от 16 до 64 байтов; игра использует 32. Зерно телефона содержит от 1 до 128 символов: латинские буквы, цифры, _ и -; приложение создаёт 32 шестнадцатеричных символа.
Почему это работает
Печать лежит на столе ещё до первого броска, поэтому сервер не может подменить своё зерно, увидев, как идёт партия: изменилась бы и печать. Ваш телефон выбирает своё зерно уже после того, как печать показана, поэтому сервер не может подобрать зерно под него. Каждый бросок зависит от обоих зёрен, и всё, что нужно для пересчёта, есть у вас.
Если страница показывает бросок, который отличается от того, что вы видели на доске, или печать не совпадает, сохраните ссылку и напишите на [email protected]. Мы хотим об этом знать.
Ссылки на эту страницу
Кнопка «Проверить броски» в приложении открывает эту страницу со всем, что стоит в ссылке после знака #. Эту часть ссылки браузер никогда не отправляет на сервер: /ru/check/#v=1&s=…&c=…&p=a,b&r=6344…&g=52,48. Здесь s означает зерно сервера, c печать, p зёрна телефонов в порядке мест за столом, r все броски по две цифры в порядке бросков, а g для матча из нескольких партий показывает, сколько бросков ушло на каждую партию.