DTF Randomizer: Перезагрузка. Теперь точно 100% без скама. Переделал ВСЁ!
Неделю назад я запустил свой новый проект — https://dtfrandomizer.xyz/. Это сайт для проведения розыгрышей на ДТФ без возможности скама. Ну, по крайней мере, такая была идея.
Вы очень хорошо его приняли и поддержали меня, чему я очень рад. Это дало мне мотивацию довести сайт до ума. Спасибо вам огромное!
Но была и критика. Люди указывали, что нет доказательств, что сервер не подкручивает. И они были правы. Не в том смысле, что подкручивал, а про доказательства.
Обнаружив, что на дтфпасс можно нарисовать любой результат, я сфокусировался на том, чтобы сделать аналог сайта, но с серверной логикой. Мне даже не пришло в голову, что люди и серверу не будут доверять.
К счастью, в комментариях нашлось много людей, которые давали разные советы и идеи. Спасибо всем! Отдельная благодарность @Нехороший русский, @Algebra и @Картошка за идеи по решению фундаментальных проблем — без вас я бы не додумался (не сарказм).
Какие были проблемы
О, их было много. Причём как на фронте, так и бэке.
Список основных проблем:
- Не было отдельных страниц для результата
- Сайт начинал тормозить из-за огромного списка розыгрышей, который ещё и ужасно выглядел
- Не было возможности подтвердить авторство розыгрыша
- Невозможность проверить честность сервера
Кроме того, нашлись и мамкины хацкеры, которые что только ни пытались сделать:
- DDoS сервера✅
- Долбёжка в порты ✅
- Засирание истории ежесекундными запросами ✅
- Попытки зайти на несуществующую админку или wp ✅
Но это всё второстепенные задачи, которые я уже частично решил. Перейдём к решению основных.
Результаты розыгрышей
Предыдущая версия была просто ужасна. Огромный список победителей вперемешку с их комментариями. А если победителей сотни, то сами понимаете. И никакой отдельной страницы результата не было. Ужс.
А что говорить, можно же показать:
Мда, лучше бы не показывал. В своё оправдание хочу сказать, что у меня было очень мало времени на создание сайта. Я знал, как сделать хорошо, но не успел бы до понедельника.
Вот как это выглядит теперь:
Вы всё ещё можете использовать поиск для нахождения победителей. Он ищет по бОльшим параметрам, чем видно в истории.
А теперь посмотрим на страницу результата розыгрыша:
На этой странице можно найти следующее:
- Ссылку на пост
- Автора поста и розыгрыша
- Точную дату и время (ваше локальное время)
- Параметры розыгрыша
- Расчёт списка участников с причинами учёта
- Списки победителей и участников с ссылками на профили
- Секция для самостоятельной проверки честности рандома (об этом позже)
К сожалению, у всей этой красоты есть цена — придётся вайпнуть базу данных. Структура и количество данных совсем другие. Конечно, мигрировать возможно, но это будет слишком затратно по времени, а результат всё равно будет дерьмовым — пустые поля везде. Я ведь не могу нарисовать несуществующие данные. Надеюсь, никто не обидится.
Тормоза сайта
Тут я не хочу слишком вдаваться в подробности, потому что пост и так уже немаленький.
Причина лагов была в рендере миллиарда мусорных записей в истории розыгрышей.
Чтобы такое не повторилось, я добавил виртуализацию записей истории. Это значит, что будут рендериться только те записи, которые вы видите + немного сверху и снизу. При скролле соответственно рендерятся новые и удаляются старые. Для вас ничего не поменяется, но лагов больше не должно быть.
Кстати, если бы на ДТФ добавили такое в секцию комментариев, то даже посты с тысячами комментов не фризили бы весь бразуер к херам.
Также уменьшению лагов поспособствует следующее крупное изменение в работе сайта.
Идентификация автора розыгрыша и поста
Вот тут мы вступаем в секцию, которая может многим не понравиться. Если все прям возненавидят это нововведение, то я подумаю о том, чтобы отменить или изменить его.
Одна из основных проблем сайта была в том, что любой человек мог роллить любой пост сколько угодно раз. Это в свою очередь приводило к двум проблемам:
- Кто-то по приколу засирал историю и базу данных розыгрышами
- Кто-то мог начать спамить роллы прямо перед и во время назначенного автором времени розыгрыша, чтобы потом трудно было сказать, где настоящий
Эти проблемы можно было решить одним способом — идентифицировать реального автора розыгрыша. Сначала я думал сделать пометку, кто реальный автор, но потом подумал: а зачем вообще крутить чужие посты? В итоге решил сделать так, чтобы каждый мог разыгрывать только свои посты.
Но как это сделать, если на ДТФ нет системы авторизации (OAuth)? Ответ мне подсказали в комментариях — генерировать код и отправлять через моего бота @NikosBot. Спасибо ещё раз за идею!
Я так и сделал. Теперь вы можете написать боту в личку сообщение "дай код" и получите код доступа для проведения розыгрышей.
Это надо только чтобы проводить их, но не для просмотра истории или результатов!
Он сохраняется в браузере и вам не надо будет повторять этот процесс. Если запросите новый код, старый станет недействительным. Вы всегда можете удалить старый код и ввести новый.
Этот код не даёт доступа ни к какой важной информации, он всего лишь позволяет проводить крутки на пост, автор которого тот же человек, что написал боту. Ничего страшного не произойдёт, если спалите его где-нибудь! Просто запросите новый.
Далее заходим на сайт и пишем код в форму:
Если вы не можете написать боту в ЛС, потому что у вас нет подписки, то советую почитать эту инструкцию. Ссылка на неё также есть и на сайте. Если ничего не получается, пишите мне тг!
Я знаю, как люди в интернете не любят всякого рода ограничения и новые правила. Да что там говорить, я сам создал расширение для дтфа в том числе из-за этого. Но поверьте мне, оно того стоит. Прошу дать шанс этой системе и не полениться сделать пару лишних кликов ради чистоты розыгрышей.
Кто-то может подумать: а не навредит ли эта система честности круток? Ведь сервер знает заранее, кто автор.
Нет, не знает. Подробности в следующей секции, которую надо читать с открытой форточкой.
Честность сервера
Объясняю вкратце, как это работает и почему сервер не может подкрутить ничего.
Информация ниже не нужна для проведения розыгрышей. И вообще не нужна никакому нормальному человеку. Я вас предупредил.
Когда в заходите на сайт, сервер генерирует некое ключ-значение (сид), которое можно пересчитать в другое значение (хэш) только в одном направлении.
Вы ещё до розыгрыша видите хэш этого сида. Сам сид сохраняется на сервере за вашей сессией и будет единоразово использован для будущего розыгрыша. При обновлении страницы генерируется новый сид.
При заходе на сайт вы сразу же видите следующее:
Также ваш компьютер локально генерирует свой подобный ключ. Его можно всегда пересоздать, нажав на кнопку. При этом никакой сетевой активности не происходит (это можно проверить). То есть сервер не знает ваш сид.
Он отправится на сервер только когда вы укажите ссылку на пост и начнёте розыгрыш. Взамен, вместе с результатами, вы получите изначальный сид сервера, который в комбинации с вашим вычисляется в финальный хэш.
Финальный хэш — это то значение, которое использовалось для определения победителя.
Можно дополнительно проверить, что сид сервера равен тому хэшу, что вы видели изначально, но в этом нет необходимости.
Чтобы быть уверенным, что результат не подкручен, должны быть верны все условия:
- Ваш сид + серверный сид вычисляются в хэш, который равен финальному
- Применив его на том же списке участников и алгоритме, который у меня на сервере, вы получите тех же победителей
- Список участников всегда отсортирован по алфавиту
Всю необходимую информацию для самостоятельной проверки вы сможете всегда найти внизу страницы результата розыгрыша.
Там же будет ссылка на демку, где опубликован мой алгоритм вычисления победителей. Я подготовил небольшой интерфейс и логику, чтобы любой мог проверить даже без знания программирования — просто заполните все поля. Если вам не нравится, можете сами проверить, как считаете нужным.
А что насчёт кода доступа?
Тут на самом деле всё просто — это не настоящая авторизация на сервере. Код проверяется сервером только один раз в момент его первой регистрации, чтобы убедиться, что он существует в базе данных.
После этого при посещении сайта происходит ЛОКАЛЬНАЯ проверка на наличие кода. Вы можете убедиться в этом сами на вкладке network.
Более того, вы можете даже поиграться немного в хакера и обойти запрос кода, просто создав accessKey ключ в localStorage с любым значением:
Конечно же, это не позволит проводить никакие розыгрыши.
Это не баг, а фича! Это просто лишний раз служит подтверждением, что сервер не знает о вас до того, как вы отправите ссылку на пост.
Но даже если бы и знал, всё равно ему придётся использовать ваш сид, что сделает подкрутку невозможной.
Надеюсь, теперь не будет возникать вопросов по поводу честности? Хотя кого я обманываю, конечно будет. Найдутся те, кто скажет, что и этого недостаточно и надо было использовать квантовую запутанность. Но это я, пожалуй, оставлю кому-нибудь другому.
Что дальше
Если вы дочитали до сюда, то заслуживаете знать, что ещё планируется сделать для этого сайта.
Как вы могли заметить, у сайта простенький дизайн. Это мой личный фирменный стиль — серый вертикальный список!
Но не всё потеряно! Человек, который делал дизайн для моего расширения DTF ReReDesign предложил задизайнить и этот сайт! Если ему будет не лень, то, возможно, сайт ждёт редизайн.
Спасибо всем ещё раз за поддержку! Ниже будут всякие ссылки.
Сайт:
Моё расширение:
Телеграм-канал:
Мой тг для связи по любым вопросам:
Первый пост про сайт: