Честность KAKALOT Originals: проверьте каждый раунд сами
Каждая игра KAKALOT Originals устроена так, чтобы вы могли проверить: результат был определён до вашей игры и не менялся после. Эта страница объясняет идею и шаги, чтобы вам не приходилось верить сайту на слово.
Идея: сначала зафиксировать, потом раскрыть
Перед игрой система создаёт секретное значение, называемое серверным сидом, и показывает вам только его обязательство (SHA-256 серверного сида). Обязательство работает как запечатанный конверт: сайт не может позже изменить секрет так, чтобы хеш по-прежнему совпадал.
Каждый результат вычисляется из серверного сида, клиентского сида (значения с вашей стороны) и номера раунда (nonce) с помощью HMAC-SHA256. Когда вы нажимаете «Сменить сид», прежний серверный сид раскрывается, и вы можете сами пересчитать каждый раунд, сыгранный с ним.
Как проверить раунд
- Перед игрой запишите обязательство текущего сида (хеш серверного сида), клиентский сид и nonce.
- Играйте как обычно. У каждого раунда есть идентификатор раунда, и он появляется в вашей истории ставок.
- Нажмите «Сменить сид и раскрыть прежний». Будет показан серверный сид предыдущей пары.
- Проверьте, что SHA-256 раскрытого серверного сида равен обязательству, которое вы видели перед игрой. Если они совпадают, сайт не менял значение после того, как вы начали.
- Вычислите HMAC-SHA256, где ключ — серверный сид, а сообщение имеет формат этой игры (таблица ниже), и сравните с результатом раунда.
- Или нажмите «Проверить» на странице игры: ваш браузер пересчитает всё за вас, не доверяя результату сервера.
Форматы сообщений в каждой игре
В примерах используются клиентский сид clientSeed и nonce 7; ваши реальные значения показаны на странице игры. Игры, использующие несколько дайджестов, нумеруют их с 0.
| Игра | Сообщение |
|---|---|
| HEADS OR TAILS | clientSeed:7 |
| DRAGON'S VAULT | clientSeed:7:vault:0 , clientSeed:7:vault:1 |
| DROP CHAIN | clientSeed:7:drop:0 , clientSeed:7:drop:1 , ... |
| COIN FOX | clientSeed:7:reels:0 , clientSeed:7:reels:1 , ... |
| ROYAL INGOTS | clientSeed:7:ingot:0 , clientSeed:7:ingot:1 , ... |
| GOLDEN KICK | clientSeed:7:kick:0 , ... , clientSeed:7:kick:3 |
| FOXBALL | clientSeed:7:fb:0 , ... , clientSeed:7:fb:7 |
Розыгрыши Royal Jackpot используют дополнительное сообщение. Для HEADS OR TAILS это clientSeed:7:jackpot, а первые 6 байт результата — число, определяющее джекпот.
Ключ HMAC — байты серверного сида (шестнадцатеричная запись: основание 16, 64 символа). У каждой игры своё правило преобразования результата в монеты, карты или поле; подробности смотрите в руководстве по каждой игре.
Пример кода: проверка HEADS OR TAILS
Приведённый ниже код выполняется в консоли вашего браузера. Он проверяет обязательство и бросок монеты одного раунда (сообщение clientSeed:nonce).
const hex = (s) => Uint8Array.from(s.match(/../g).map((h) => parseInt(h, 16)));
const toHex = (b) => [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, '0')).join('');
async function verifyCoin(serverSeed, serverHash, clientSeed, nonce, coins) {
const seed = hex(serverSeed);
const hashOk = toHex(await crypto.subtle.digest('SHA-256', seed)) === serverHash;
const key = await crypto.subtle.importKey('raw', seed, { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
const digest = new Uint8Array(await crypto.subtle.sign('HMAC', key, new TextEncoder().encode(clientSeed + ':' + nonce)));
let result = '';
for (let i = 0; i < coins; i++) result += digest[i] & 1 ? 'T' : 'H';
return { hashOk, result };
}Идентификаторы раундов и цепочка хешей
У каждого раунда есть уникальный последовательный идентификатор, например RI-0000001 для ROYAL INGOTS на реальные деньги и DI- для демо. У каждой игры свой префикс, а идентификатор раунда отображается на странице игры и в вашей истории ставок.
База данных хранит цепочку хешей последовательных раундов: хеш каждого раунда включает хеш предыдущего раунда, идентификатор раунда, обязательство сида, клиентский сид, nonce и результат. Если бы раунд изменили или вставили позже, цепочка оборвалась бы и перестала бы совпадать во всех последующих раундах.
ROYAL BACCARAT: каждая карта зафиксирована
Баккара фиксирует всё сабо. Когда открывается сабо, его 416 карт (8 колод) перемешиваются, и каждая карта фиксируется обязательством SHA-512 для текста «position:card:salt». Когда карта сдана, её соль раскрывается, и вы можете проверить, что сданная карта совпадает с зафиксированной до первой раздачи. Когда сабо заканчивается, его сид раскрывается, и можно проверить всю тасовку. Подробности — в руководстве по ROYAL BACCARAT.
Что важно знать об ограничениях
Такая проверка доказывает, что результаты не менялись после того, как вы начали, и были вычислены по опубликованным правилам. Она не делает следующий раунд предсказуемым и не улучшает ваши шансы: каждый раунд по-прежнему случаен.
Демо, в которое посетители играют без регистрации, создаёт сид и вычисляет результаты прямо в вашем браузере тем же движком и по тем же таблицам, что и настоящая игра. Это тренировка на бесплатных очках: без денежного счёта и без джекпота.
Часто задаваемые вопросы
Что такое Provably Fair?
Это способ, позволяющий игрокам проверить, что каждый результат определён значениями, зафиксированными до игры: сайт сначала показывает обязательство для своего секрета, а затем раскрывает сам секрет, чтобы результат можно было пересчитать.
Нужно ли писать код, чтобы проверить?
Нет. Нажмите «Проверить» на странице игры, и ваш браузер сделает всё сам. Если хотите проверить самостоятельно, воспользуйтесь шагами и примером кода на этой странице.
Почему перед проверкой нужно сменить сид?
Серверный сид — секрет. Если бы он раскрывался, пока ещё используется, любой мог бы заранее знать следующие результаты, поэтому он раскрывается только тогда, когда вы переходите на новую пару.