Чесність, яку можна перерахувати: як ми будували платформу кейсів CS2

Шанси кожного предмета до оплати, сид, зафіксований заздалегідь, і апгрейд, формулу якого бачить гравець. Розбираємо механіку Gocase.gg і рішення, які зробили її перевірною.

Команда YAVKA

· 4 хв читання

Кейс-сайти тримаються на довірі, а довіри до них небагато: гравець за замовчуванням певен, що результат підкручено. Тому, коли ми починали платформу кейсів CS2 Gocase.gg, правило було одне: кожен результат визначає сервер, і будь-хто може його перевірити. Усе інше — рулетка в стилі CS2, апгрейд, контракти — будувалося вже довкола цього правила.

Шанси — до оплати, а не після

У самій CS2 Valve розкриває лише ймовірності за рідкістю. Кейс-сайт збирає кейси сам, а отже, може показати шанс кожного предмета. На сторінці кейса для цього є перемикач «Показати шанс»: вмикаєте його й бачите, що ніж випадає в тисячних частках відсотка, а найдешевші скіни — у двох-трьох відкриттях із десяти.

Шанси рахуються з цільового RTP кейса й поточних оцінок предметів і перераховуються, коли змінюються ціни в Steam. Базовий RTP каталогу — 90%. І важлива деталь: у генераторі немає прихованих обмежень на дорогі дропи. Якби вони там були, перевірка чесності втратила б сенс — показані шанси перестали б збігатися зі справжніми.

Сторінка кейса з увімкненими шансами: у ножів і рукавичок — тисячні частки відсотка, у дешевих скінів — десятки відсотків.
Сторінка кейса з увімкненими шансами: у ножів і рукавичок — тисячні частки відсотка, у дешевих скінів — десятки відсотків.

Як влаштований provably fair

Перед відкриттям сервер генерує секретний серверний сид і показує гравцеві лише його хеш SHA-256. Гравець задає власний клієнтський сид, а кожне відкриття має порядковий номер. Число, яке обирає предмет, — це HMAC-SHA256 від пари сидів і номера, а сам предмет обирається за вагами з тієї самої таблиці шансів, що видна на сторінці кейса.

Поки сид діє, відомий лише його хеш, тож підігнати результат під конкретного гравця неможливо. Коли гравець змінює серверний сид, старий розкривається, і кожне відкриття, зроблене з ним, можна перерахувати на сторінці перевірки чесності. Форма там викликає ту саму функцію, що працює під час відкриття кейса, — окремої «демонстраційної» логіки немає.

Сторінка «Чесність»: хеш поточного серверного сиду, власний клієнтський сид і форма, яка перераховує будь-яке відкриття.
Сторінка «Чесність»: хеш поточного серверного сиду, власний клієнтський сид і форма, яка перераховує будь-яке відкриття.

Рулетка підлаштовується під відповідь сервера

У браузер приходить уже готовий результат, і вітрина будує стрічку під нього: переможець стоїть у заздалегідь відомій позиції, а довкола — предмети того самого кейса. Прокрутка повторює криву гальмування CS2 і звучить як у грі. Можна відкрити до п’яти кейсів одночасно паралельними колонками, увімкнути швидкий режим або автовідкриття з лімітами прибутку й збитку. Баланс списується в одній транзакції з видачею предмета, тож підкрутити щось із браузера не вийде.

Такий поділ розв’язує руки дизайну. Анімацію можна шліфувати скільки завгодно: вона нічого не вирішує, лише показує рішення.

Апгрейд: формула на видноті

В апгрейді гравець ставить предмет з інвентарю заради дорожчого. Шанс рахується так: ціну ставки ділять на ціну цілі й множать на RTP 90%, а згори стоїть стеля 85%, щоб майже рівний обмін не ставав гарантованим. Ставка 100 монет на предмет за 300 дає 30%. Ціль має бути дорожчою за ставку щонайменше в 1,05 раза й не більше ніж у 20 разів.

Колесо малює сектор рівно на величину шансу, а стрілка зупиняється на числі, що випало: влучання в сектор і є виграшем, окремої логіки для анімації немає. Схема сидів та сама, що й у кейсів, тому апгрейд перевіряється на тій самій сторінці. Правила з формулою відкриваються просто зі сторінки апгрейду разом із чесним попередженням, що в разі програшу ставка згорає. А якщо ціна цілі встигла змінитися, поки гравець думав, сервер не спише ставку, а покаже новий шанс.

Схема provably fair на Gocase.gg і формула шансу апгрейду з прикладом.
Схема provably fair на Gocase.gg і формула шансу апгрейду з прикладом.

Що лишилося за кадром

Для команди є окрема адмінка: редактор кейсів із шансами, симулятором та історією версій, виведення скінів у Steam із ручною перевіркою великих сум, бонуси й промокоди. Симулятор показує, як кейс поводитиметься на дистанції, ще до того, як його побачить перший гравець, а історія версій пояснює, чому шанси стали саме такими.

Чого нас навчив проєкт

  • Результат визначає сервер і записує його — тоді інтерфейс може бути скільки завгодно ефектним.
  • Математику треба показувати там, де гравець ухвалює рішення, а не ховати на окремій сторінці правил.
  • Тексти на сайті не мають обіцяти більше, ніж робить система: кожну обіцянку гравець може перевірити.
  • Чесність — це функція, яку можна перерахувати, а не значок у футері.

Кейси — розвага для дорослих (18+), і на дистанції віддача завжди менша за витрачене; ми проєктували Gocase так, щоб гравець бачив це заздалегідь. Більше про стек, адмінку й дизайн-систему — у кейсі Gocase.gg.