Любые перетасовка основы доказуемо справедливо казино, которое используется bitZino в качестве эталонной реализации может использовать игрок.
Несколько лет назад я опубликовал анализ бокового канала атак на доказуемо справедливый метод bitZino в. Она получила теплый отклик. Сегодня я представляю прямую атаку против метода. Я называю это "shufflepuff" - инструмент казино можно использовать для оптимизации колод против игроков, эффективно создавая холодные палубы.
Есть много последних, современных казино, которые могут развернуть этот подвиг.
Вот требования:
- Казино может выбрать начальные палубы которые выполняют строго лучше против других исходных колод, независимо от семени Мерсенна Twister.
- Результатом игры является проверяемым "доказуемо ярмарка" без ущерба для какой-либо коды.
- Подвиг может постоянно изменить край дома игры за ожидаемые результаты.
- Из-за большое расположение пространства, использовать эффективно обнаружить. По крайней мере, опровергнуты.
Ого. Довольно сильные претензии, а? Я объясню это в немного более подробно. Но я предполагаю, что вы знакомы с тем, как работает это доказуемо справедливый способ. Пожалуйста, смотрите bitZino, если вам нужно освежить в памяти (https://bitzino.com/about/fair). Эта атака относится к любому казино, которое черпает свой метод подобным образом.
Вы, как игрок, не имеют возможности определить фактическое семя Мерсенна Twister. Ты можешь влияние это, но окончательное семя косвенно отнести к клиентскому семени. Тем не менее, казино бесплатно, чтобы определить начальная перетасовка. Это может быть все, что они хотят. Там нет никакой гарантии, что это перетасовка (мы будем называть его начальная колода теперь) в любом случае случайное, и это где эксплуатируют начинается.
В двух словах, дом знает, что окончательное перемешивание будет один из 232 возможные перетасовки. Поскольку исходная колода пространство может быть астрономический больше, чем окончательные тасованями пространства, дом просто нужно найти начальную колоду, которая хорошо работает против как много конечных тасуют как это возможно.
Как определить, оптимизированную, уложенную палубу?
Давайте попробуем в рулетку, так как он имеет наименьшее пространство поиска. В реальном мире, это колесо игра, но казино, как bitZino относиться к нему, как карточная игра, тем не менее.
- Во-первых, мы вырождаются деку в точечных значений на основе результатов мы хотим. Например, если мы хотим, чтобы оптимизировать палубу для красного, мы преобразуем все красные карточки до +1, а остальные (в том числе зеленый) до 0.
- Мы организуем колоду точку в лексикографическом (отсортированный) порядке: {0000000000000000000111111111111111111}.
- Для всех перестановок (без повторений), выполнить Фишера-Yates или Durstenfeld перетасовать со всеми возможными семян Вихрь Мерсенна (которые варьируются от 0 до 232 - 1). Добавьте первое значение перетасовки прокатки счета.
- Сравните две перестановки. Если один имеет более высокий счет, чем другие, это строго лучше, чем другие. Значение, казино может использовать его, чтобы навсегда изменить край дома.
Shufflepuff код (C ++)
Код:
#включают
#включают <алгоритм>
#включают <случайный>
ЬурейеЕ станд :: вектор<ИНТ> deck_t;
INT оценщик (deck_t колода, сопзЬ неподписанных INT& семена) {
станд :: mt19937 двигателя (семена);
станд :: перетасовка (deck.begin (), deck.end (), двигатель);
вернуться палубе [0];
}
Int основных () {
deck_t колода {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1 , 1,1,1,1,1,1,1,1,1,1,1,1,1};
станд :: сортировать (deck.begin (), deck.end ());
// Уменьшаем это число, чтобы увидеть инструмент в действии. Результаты не доказательственное, если пространство не является 2 ^ 32 -1.
сопзИте неподписанный INT SEED_SPACE = 4294967295;
беззнаковое INT I = 0;
без знака счетчика INT = 0;
неподписанных INT высокий = 0;
делать {
кол = 0;
для (я = 0; я <= SEED_SPACE; ++ я) {
рассчитывать + = вычислитель (палубы, я);
}
если (кол > наибольший) {
рассчитывать высокие =;
для авто (сопзИ& с: палуба) станд :: соиЬ << с;
станд :: соиЬ << ": " << наибольший << станд :: епсИ;
}
} В то время как (станд :: next_permutation (deck.begin (), deck.end ()));
возвращать 0;
}
// Run: лязг ++ -std = C ++ 11 main.cpp
// Тогда: ./a.out
#включают <алгоритм>
#включают <случайный>
ЬурейеЕ станд :: вектор<ИНТ> deck_t;
INT оценщик (deck_t колода, сопзЬ неподписанных INT& семена) {
станд :: mt19937 двигателя (семена);
станд :: перетасовка (deck.begin (), deck.end (), двигатель);
вернуться палубе [0];
}
Int основных () {
deck_t колода {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1 , 1,1,1,1,1,1,1,1,1,1,1,1,1};
станд :: сортировать (deck.begin (), deck.end ());
// Уменьшаем это число, чтобы увидеть инструмент в действии. Результаты не доказательственное, если пространство не является 2 ^ 32 -1.
сопзИте неподписанный INT SEED_SPACE = 4294967295;
беззнаковое INT I = 0;
без знака счетчика INT = 0;
неподписанных INT высокий = 0;
делать {
кол = 0;
для (я = 0; я <= SEED_SPACE; ++ я) {
рассчитывать + = вычислитель (палубы, я);
}
если (кол > наибольший) {
рассчитывать высокие =;
для авто (сопзИ& с: палуба) станд :: соиЬ << с;
станд :: соиЬ << ": " << наибольший << станд :: епсИ;
}
} В то время как (станд :: next_permutation (deck.begin (), deck.end ()));
возвращать 0;
}
// Run: лязг ++ -std = C ++ 11 main.cpp
// Тогда: ./a.out
Чем Примечание
- Это доказательство концепции и намеренно отличается от bitZino. Это не прямая реализация один к одному, так что вам нужно будет изменить его, чтобы обнаружить реальную оптимизированную перетасовку. После того, как прошло некоторое время (чтобы распространить слово), я выложу оптимизированную договоренность, я обнаружил, что буду работать как "вставных" использовать для bitZino и других.
- Программа будет выводить перестановку и количество семян, которые он бил. Разделите количество семян избитых семян пространства (плюс 1), чтобы получить вероятность выигрыша. Если это превышает теоретическое ожидание, то это частичное оптимизировано расположение.
- Этот код не оптимизирован для скорости. Это займет много времени (17+ часов), чтобы вычислить один-32 Семя пространство. Если вы хотите, чтобы увидеть его в действии, вы можете снизить SEED_SPACE (до 5000, например), чтобы получить представление, хотя результаты не являются действительными. Код может быть приспособлен для распределенных или параллельных вычислений.
- BitZino также страдает от смещения по модулю в том, как он вычисляет случайные числа. См источник (https://bitzino.com/about/fair), Строка 801, поэтому алгоритм воспроизведения в случайном порядке в C ++ код также должен быть рукописным, чтобы имитировать это.
Последствия
- После того, как договоренность была найдена, она может быть легко замаскирован, чтобы предотвратить обнаружение. В примере, устройство представляет только положение красного и черного, но казино может заполнить его с любой красной или черной картой, эффективно производить перетасовки, которые появляются разные.
- Казино представляет перетасовать первый, но он может извлечь из последующего воспроизведения. Игрок, который последовательно играет красный или черный (или зеленый) могут быть использованы в следующем раунде.
- Казино не нужно, чтобы найти наиболее оптимизированные перетасовать, только тот, который бьет теоретические ожидания. Таким образом, гнусное казино будет собирать множество оптимизированных перетасовок на постоянной основе, что делает его эффективно обнаружить.
- В перетасовки могут быть использованы, чтобы помочь вам выиграть, а также. Например, дом может дать хорошие перетасовки, чтобы помочь пыли выиграть пари, в надежде, что они ставку больше (где они тогда могли быть обмануты с плохими тасует для более Bitcoin).
Я знаю, что это много, чтобы переварить в ограниченном пространстве у меня есть. Я попытался отогнать доказательство и большую распределенную вычислительную код во что-то простое, так больше. Я буду вокруг в течение нескольких часов, чтобы ответить на некоторые вопросы. Спасибо за прочтение!
Обновить
добавленной "Доказуемо Недобросовестная Blueprint" в этой теме. ()