×

Рулетки, rand и хеши

Никогда не думал что буду разрабатывать рулетку для counter strike, а вот оказывается пришлось связаться со стимом, его апи и стим ботами.

В процессе написания, узнал многое о игровом бизнесе вообще, заметка пойдет о «общепринятом способе», доказательства честности рулетки.

Как это происходит?
Еще до начала игры, рулетка генерирует случайный float от 0 до 1 и открыто публикует его хеш.

Каждый внесший деньги получает билеты, например 0,1$ = 1 билету, если я внесу 10$, то получу 100 билетов, выигрывает всегда один билет. т.е. чем больше внесу денег, тем больше шансов победить.

Победителя определяют по формуле
Случайное число * размер банка = (int)победивший билет

После победы публикуют еще один хеш
md5( хеш случайного числа + размер банка + всякая ненужная инфа)
Нам предлагают калькулятор, где можно этот хеш пересчитать и удостовериться в его подлиности.

Как мы видим, это полная фигня, ведь нам так и не сообщили начальное число, следовательно мы его не можем проверить.

Беда, попробуем исправить. Допустим, после розыграша число будет открыто, мы сможем генерировать хеш и убедится что это оно и было. Ок
md5( md5(случайное число) + размер банка)

Это правда позволит нам удостоверится что число было случайным.

Продолжим. Да, число действительно случайное, но не забываем о второй переменной — размере банка. Как бы нам не казалось что размер банка неизвестен, это не совсем так.

Банк — число динамическое, а следовательно я могу расставить по длине всего банка пару подставных ставок, меняя их я подгоню итоговое число так, что выигрыш будет на нужной ставке, казино опять победит.

Это никак не изменить, нельзя ведь отобрать у игроков возможность ставить деньги?

Все ли казино этим пользуются?
Мой работодатель утверждает о свой честности, я ему верю, так как пишу код этой рулетки. В тз нет ничего о «регуляторах банка», но все же, хеши никакая не гарантия.

Есть ли 100% способ проверить честность казино? думаю нет, нечестный на руку всегда найдет лазейку.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Ну... можно чтобы каждый игрок генерировал случайную последовательность байт и публиковал её SHA. На этапе розыгрыша все последовательности вскрываются, публикуются, объединяются, считаем SHA которым и будет случайным числом, определяющим победителя.

Тут вопрос скорее в том, что делать в том случае, когда кто-то из игроков отказывается публиковать случайное число. Поэтому можно делать схемы вроде дерева, когда победитель будет определён в результате попарных сравнений. И тогда ну не открыл ты хеш — автоматически проиграл, и это никак не повлияло на результат.

Не знаю, как сделать «рулетку» для нескольких одновременных игроков без возможности обмана со стороны казино.

Но можно сделать честную «лотерею» для одного игрока:
0) Игрок выбирает желаемый целочисленный множитель ставки N.
1) Казино генерирует случайное целое число от 1 до N, отправляет хэш игроку.
2) Игрок делает ставку $x на целое число от 1 до N.
3) Казино открывает игроку число, сгенерированное на первом шаге.
4) Игрок проверяет, что хэш с первого шага совпадает с вычисленным хэшем от числа на третьем шаге.
5) При совпадении чисел казино выплачивает игроку сумму $x*N*(1-p/100), где p — процент маржи казино.

Очевидно, что просто хэш тут не походит — иначе игрок может быстро пробрутфорсить все варианты перед вторым шагом. Поэтому нужно использовать что-то типа MAС. Например, вычислять хэш от числа плюс случайного набора бит, который возвращать игроку на третьем шаге.

Коментар порушує правила спільноти і видалений модераторами.

Коментар порушує правила спільноти і видалений модераторами.

Лучше до розыгрыша подписать случайное число электронной подписью, например используя алгоритм на эллиптической кривой P-256, и выдать игроку открытый ключ и сигнатуру. В чём преимущество: в отличии от хэша он не сможет пробутфорсить 2^32 варианта, поскольку не знает закрытый ключ. Зато на основании открытого ключа сможет убедиться в достоверности случайного числа.

Можно, но проблема не там.

Поэтому только live -только няшные девочки , кидающие шарик ручками)

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

Ни одно казино не будет страдать херней, если хочет зарабатывать — ему нужен постоянный поток клиентов, которые и обеспечат заработок.
Каждый случай выигрыша проверяется службой безопасности на предмет мошенничества, сговора с крупье, и недоработки крупье. Клиент должен проиграть, и не когда нибудь, а прямо сейчас. И спокойно, не отыгрываясь, уйти. Будут деньги у клиента — вернется. Не будут — ну и ладно.

Кидают не всех клиентов, а азартных, сорвавшихся на большую игру. Остальным напротив — дают по мелочи выиграть. У меня был знакомый, который профессионально этим занимался.
До 100 долларов в день ему давали выиграть, чтобы создать движ. Попытка засидется за столом купировалась немедленной серий проигрышей.

Еще ни разу в Live при живых девочках -не было серий больше 16 красного или черного при мне. Хоть и вероятность 50% при каждом броске. Но вероятность выпадения серии нескольких подряд — меньше с каждым броском. Так вот в автоматах казино и по 18 и по 25 было подряд.

Теория вероятности про шанс выигрыша 36/37 — это для владельцев казино, которые владеют всем множеством розыгрышей, что они всегда в выигрыше будут. А у каждого игрока -своя серия в этом множестве. Кто-то проигрывает, кто-то выигрывает. Тут ТВ не работает на мелких сериях. Больше вероятностная комбинаторика.

Никто никуда не скатывался. В реале, не в теории вероятности на автоматах, а в реале- ни на форумах, не в реале в live рулетку. не бывает выпадений больше 20. Нигде никто никогда не слышал. Был один случай..в Монако 18 августа 1913 года выпало черное 26 раз и Фсё.
Поэтому выигрывать в принципе, можно на пределе лимитов казино, умножая при каждом ходу ставку не в 2, а в 2,5-3 хотя бы, и сидеть сутками, начиная ставить, когда около 12-15 раз подряд подряд одного цвета. Но это нервы палит на раз.) Да и редко такие серии бывают..

сидеть сутками, начиная ставить, когда около 12-15 раз подряд подряд одного цвета
Да вы желанный клиент в любом казино будете. Правда на удвоении выиграть всё равно не выйдет, поскольку есть верхний и нижний предел ставок. А на автоматах кроме того делаются градации ставок такими, чтобы невозможно было играть на удвоение даже на коротких сериях.

Выйдет, 2,7% процента- это заработок казино, от ВСЕХ разыгранных ставок, конкретных игроков это касается индивидуально, постольку -постольку. И проверено когда-то было на Бетфейр лив. от верхнего до нижнего предела где-то 10- 11 удвоений получается. от 0,5 до 10 000. Другое дело ,что верхний предел- большая сумма, нервы палит ,с учетом того, что на Зеро тоже нужно ставить с удвоением. Но все может быть. Только не удваивать нужно, а в 2,5 где-то увеличивать. Чтобы не только минимальную ставку выигрывать ,а большие суммы. Желанным клиентом ты не будешь ,потому что такие серии не каждый час даже выпадают. Нужно дождаться ,чтобы серия до начала ставок уже была 7-8 подряд. Сидеть часами ждать ставку тупо, но все реально. Вероятность серии из 19 КРАСНОЕ = 0,49 ** 18= 0,00000012.
Бывает, но редко, я такой серии в Live никогда не слышал даже на форумах, например.
А вот в автоматах, такое может быть, поэтому только Live.
Чаще будете выигрывать, а с учетом ,не удвоения, а в 2,5 раза- большие суммы, что компенсирует возможный проигрыш. Правда возможно забанят за догон.
И главное, не увлекаться и не играть несколько десятков тысяч спинов ,а то сработает статистика и мат. ожидание все-таки сыграет против вас)

Коментар порушує правила спільноти і видалений модераторами.

Я не совсем въехал в алгоритм ставок, каким образом я могу выбрать выигрышный номер? Или это не предусмотрено?

Для того чтобы казино играло честно, оно не должно знать суммы ставок (или номера на которые сделаны ставки) до тех пор пока не опубликовано случайное число:

1. Казино генерирует число (x) и рассылает md5 хэш числа X (h[X]md5) игрокам.
2. Игроки делают ставки: игрок вводит сумму ставки + генерирует пару ассиметричных ключей (Kpub + Kprivate).
3. Игроки шифруют сумму ставки E[X]Kpub и отсылают ее казино и другим игрокам.
4. После того как получены все ставки, Казино рассылает число X игрокам. Игроки могут посчитать md5 хеш от X и убедиться, что оно не изменилось.
5. Игроки обмениваются секретными ключами (Kprivate) между собой и Казино.
6. Игроки и Казино могут расшифровать все суммы ставок и вычислить номер выигрышного билета.

В классическом варианте рулетки игроки могут шифровать номер на который сделана ставка, в таком сумма ставки секретом не является.

Теперь по поводу md5 алгоритма:

1. MD5 не устойчив к коллизиям. Соответственно для числа X я могу найти числа Y,Z ... для которых будет выполнятся h[X]md5 == h[Y]md5 == h[Z] md5. Это дает теоретическую возможность Казино выбрать наиболее выгодное число из последовательности X, Y, Z

2. Любой хеш алгоритм без соли не устойчив к атакам по словарю. В данном случае игрок может моментально узнать число X получив его хеш. Это дает возможность читить игроку.

Проблема решается с помощью шифрования публичным ключом и рассылкой приватного ключа когда число X больше не является секретом.

Наиболее развернутый ответ

Большинство казино использует md5, для перехода на один из sha хешей, прийдется многое объяснять теоретически не подкованным юзерам.

В казино, ставка должна быть изъята до игры, что ломает все манипуляции с ключами.

Зная случайное число, можно сделать три ставки в разное время, таким образом у вас будут билеты в начальных числах, в середине и в конце. Подымая или опуская суму одной из ставок, вы двигаете следующие ставки по номерам вперед или назад. Таким образом зная банк и случайное число, можно подвинуть свою ставку на выиграшную позицию.

Но, айтишники слишком хорошо знают как их найдут, а простому обывателю расшифровка не по силам. Вот принимай казино биткоины... настал бы абзац ему через неделю.

Вы сказали, что можно получить число Х, зная его хэш.(Если я правильно вас понял), то возьмем рулетку CSGOFAST (дабл, красное, черное, зеленое). Там всегда вначале раунда генерируется хэш раунда, а вот число скрыто ( и сказано, что рулетка работает на алгоритме sha224, т.е. когда выпало число показывается число от 0 до 1, мы умножаем его на 15 и получаем то, что и выпало... ), так.. можно ли тут предугадать число, которое выпадет, зная его хэш?

Вы сказали, что можно получить число Х, зная его хэш

я имел ввиду вот это en.wikipedia.org/wiki/Dictionary_attack

ох уж этот эгоцентризм с примесями теории заговоров

казино не выгодно изобретать алгоритмы «коррекции результатов» т.к. банальная статистика даёт казино стабильный фиксированный заработок, который не будет больше или меньше, даже если кто-то срывает джек пот

магия в том, что всё это работает на десятках и сотнях тысяч игровых сессий, понятно, что при паре десятков игр результат непредсказуем и кажется, что тут где-то сидит страшный дядька и регулирует переменные

Не в том случае, если это российское казино. Там жлобство изо всех щелей!

+1, в ту же степь израильский гемблинг.
з.ы. на холивары не ведусь, живу своим опытом

Нет, 100% способа на хешах нет. А соответственно нет и 0.0001%-ного способа.

Но есть решение в лоб: разослать инфу в файле, но он заархивирован с паролем. Ломануть пароль к архиву — дело накладное, дешевле биткоинов намайнить. Тогда каждый как бы УЖЕ владеет всей инфой, и может всё проверить — но реально проверит только когда получит пароль. В том же архиве может быть и список участников, и ещё доп.инфа, повышающая доверие.

Ключевой момент — это генерация случайного числа. Нужен такой генератор, который действует глобально, и на который 100% нельзя влиять. Например, градусник температуры. Или таймер, в который случится нечто предсказуемое, например упадёт капля воды. Но опять же, нужен гарант — без него никак. Иначе подделать можно всё. Мой совет — бери биржевую сводку, там крайне надёжная инфа, никаких «если». Например, цена барреля нефти на момент закрытия.

В общем, как ни крути, но если можно РАЗГРАНИЧИТЬ уровень доступа, то есть существует хоть один бит инфы, которую все игроки не могут получить их открытого доверенного источника — значит игра подделана.

Если случайное число сгенерировано заранее — то казино его знает. А значит знают и липовые игроки, которые участвуют ради получения выигрыша самим казино. Как видишь, такого не должно быть. Либо знают все, либо никто.
________
Ещё момент — лучше разбить участников на сегменты, например по 1000 билетов. И в начале избирается сегмент, а потом среди сегмента — победитель. Если же часть сегмента пуста, и жребий указал на некупленный билет — всё повторяется заново включая выбор сегмента. Это накаляет интригу. Особенно, если 4% изначально заполнить некупленными билетами. Математически ничего не даёт, но азарт прогревает круто!

PS. Алгоритм MD5 скомпроментирован, поменяй на другой.

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

Ниче не понимаю... В казино вроде когда крутится шарик, то «ставки сделаны» и ставить ниче нельзя. Типа меняется очередность :

ще до начала игры, рулетка генерирует случайный float от 0 до 1 и открыто публикует его хеш.
Типа когда все ставки сделаны, и размер банка фиксированый, только тогда генерируется случайное «равномерное» число, публикуется его хеш с розмером банка + всякой фигней и определяется победитель... А тут какой то развод — шарик запустили до начала игры :)

Шарик просто анимация, можно сгенерировать все победы хоть на год вперед.
Но, если генерировать число после формирования банка — это вообще фигня, казино может подставить любое удобное.

Підписатись на коментарі