Descoperă Cloudbet.com
certified checkmark stamp next to cloudbet logo

Cum funcționează jocul Mines cu tehnologie demonstrabil corectă la Cloudbet: o analiză tehnică


Jocurile de noroc demonstrabil corecte rezolvă o problemă inerentă cazinourilor online încă de la apariția lor: cum poate un jucător să aibă încredere că rezultatul unui joc nu a fost manipulat ulterior plasării unui pariu? Se pare că răspunsul este același instrument la care apelează criptografii ori de câte ori două părți trebuie să ajungă la un acord fără să aibă încredere una în cealaltă – o schemă de tip angajament-dezvăluire.

În continuare, îți prezentăm o descriere detaliată a procesului pe care Cloudbet îl utilizează pentru jocul Mines – de la generarea seed-ului până la plasarea minelor – și modalitatea prin care orice jucător care are cunoștințe minime de programare poate verifica în mod independent fiecare rezultat obținut vreodată în timpul jocului.

Acest articol este primul dintr-o serie planificată de analize tehnice privind mecanismele demonstrabil corecte care stau la baza titlurilor Cloudbet Originals. Pentru a verifica personal orice rundă (inclusiv cele ale jocului Mines), accesează Calculatorul privind corectitudinea demonstrabilă de la Cloudbet.

Angajamentul față de rezultat înainte de începerea jocului

Înainte de fiecare rundă, serverul generează un seed al serverului aleatoriu de 32 de byți și publică imediat hash-ul SHA3-256 al acestuia – angajamentul. Acest hash este o amprentă unidirecțională: dovedește că seed-ul exista în acel moment, fără a dezvălui care este acesta.

Odată ce jocul se încheie, Cloudbet dezvăluie seed-ul brut al serverului. Oricine poate calcula hash-ul și poate confirma că acesta corespunde angajamentului asumat înainte de începerea jocului, ceea ce dovedește că seed-ul – și, prin urmare, dispunerea minelor – a fost stabilit înainte ca prima casetă să fie aleasă. Nu există niciun moment în care cazinoul să poată înlocui valoarea cu una mai favorabilă.

Includerea entropiei jucătorilor

Dacă s-ar folosi doar seed-ul serverului, jucătorii ar fi complet dependenți de caracterul aleatoriu impus de cazino. Pentru a preveni acest lucru, se includ două inputuri suplimentare: un seed al clientului (setat de jucător) și un nonce (un număr întreg care crește cu fiecare pariu).

Toate cele trei sunt concatenate și procesate cu SHA3-256 pentru a genera semnătura rundei:

roundSignature = SHA3-256(`${serverSeed}:${clientSeed}:${nonce}`)

Seed-ul clientului garantează că rezultatul nu poate fi prevăzut de către cazino în momentul angajamentului, întrucât datele introduse de jucător nu sunt cunoscute la momentul generării seed-ului serverului. Valoarea nonce face ca fiecare rundă să genereze o semnătură distinctă, chiar și atunci când ambele seed-uri rămân neschimbate de la un pariu la altul.

Generarea de numere aleatorii cu SHAKE256

Semnătura rundei este introdusă în SHAKE256, o funcție cu ieșire extensibilă (XOF) din familia SHA-3. Spre deosebire de un hash standard, o XOF poate genera un flux de byți pseudo-aleatoriu de lungime arbitrară pornind de la o intrare fixă – ceea ce este util în acest context, deoarece amplasarea mai multor mine necesită mai multe valori aleatorii independente.

Implementarea extrage câte 4 byți odată din flux. Când ieșirea inițială se epuizează, se adaugă „next” la stare și procesul se repetă. În practică însă, o grilă cu 25 de casete și orice număr realist de mine se încadrează cu mult în primii 256 de biți.

Amplasarea minelor cu imparțialitate: eșantionarea prin respingere

Transformarea unui număr întreg aleatoriu de 32 de biți într-o poziție pe grilă prin intermediul unei simple operații modulo ridică o problemă subtilă, dar reală: dacă 2^32 nu este divizibil fără rest cu numărul de poziții rămase P, unele poziții vor avea o probabilitate ușor mai mare decât altele.

Cloudbet elimină această problemă folosind eșantionarea prin respingere:

javascript
const maxAcceptable = Math.floor(0x100000000 / P) * P;
let rand;
do { rand = rng.next().value; } while (rand >= maxAcceptable);
const index = rand % P;

Orice valoare care depășește cel mai mare multiplu al lui P care încape în 32 de biți este eliminată, iar în locul ei se extrage următoarea valoare din fluxul SHAKE256. Ceea ce rămâne este o distribuție uniformă pe exact P poziții.

După plasarea fiecărei mine, poziția respectivă este eliminată din setul de poziții disponibile, iar valoarea lui P se reduce cu 1 – echivalentul unei amestecări parțiale Fisher–Yates aplicate asupra grilei plane cu 25 de elemente.

Verificarea unei runde

Verificarea post-joc necesită patru valori, toate publicate de Cloudbet după încheierea rundei:

  • serverSeed
  • clientSeed
  • nonce
  • Pozițiile minelor declarate: minePositions

Etapele verificării sunt următoarele:

  1. Calculează hash-ul pentru serverSeed cu SHA3-256 și verifică dacă acesta corespunde cu angajamentul stabilit înainte de începerea jocului.
  2. Calculează roundSignature = SHA3-256(serverSeed:clientSeed:nonce).
  3. Inițializează fluxul SHAKE256 cu roundSignature și execută bucla de eșantionare prin respingere pentru a reproduce în mod independent minePositions.

O corespondență confirmă faptul că grila nu a fost modificată după începerea rundei.

Exemplu de implementare (Node.js)

bash
npm install js-sha3
javascript
const crypto = require('crypto');
const { sha3_256, shake256 } = require('js-sha3');

function generateServerSeed() {
  const seed = crypto.randomBytes(32).toString('hex');
  return { serverSeed: seed, commitment: sha3_256(seed) };
}

function createRoundSignature(serverSeed, clientSeed, nonce) {
  return sha3_256(`${serverSeed}:${clientSeed}:${nonce}`);
}

function* createShake256Stream(signature) {
  const byteStream = shake256.create(32);
  byteStream.update(signature);
  while (true) {
    const buf = Buffer.from(byteStream.digest({ buffer: true }));
    for (let i = 0; i < buf.length; i += 4) {
      if (i + 4 <= buf.length) yield buf.readUInt32BE(i);
    }
    byteStream.update('next');
  }
}

function pickUniquePositions(count, totalTiles, rng) {
  const available = Array.from({ length: totalTiles }, (_, i) => i);
  const result = [];
  for (let i = 0; i < count; i++) {
    const P = available.length;
    const maxAcceptable = Math.floor(0x100000000 / P) * P;
    let rand;
    do { rand = rng.next().value; } while (rand >= maxAcceptable);
    const index = rand % P;
    result.push(available[index]);
    available.splice(index, 1);
  }
  return result;
}

const { serverSeed, commitment } = generateServerSeed();
const clientSeed = 'player-provided-seed';
const nonce = 0;
const sig = createRoundSignature(serverSeed, clientSeed, nonce);
const rng = createShake256Stream(sig);
const mines = pickUniquePositions(5, 25, rng);

console.log('Commitment:', commitment);
console.log('Server seed (post-game):', serverSeed);
console.log('Mine positions:', mines);

Câteva aspecte demne de menționat

De ce SHA3 în locul lui SHA2? Pentru un angajament simplu, oricare dintre cele două variante ar fi potrivită. Construcția de tip „burete” a algoritmului SHA3 elimină atacurile de extindere a lungimii, iar utilizarea acestuia pe tot parcursul procesului – atât pentru etapa de angajament, cât și ca bază pentru SHAKE256 – asigură coerența suprafeței criptografice.

De ce SHAKE256 în locul unui PRNG cu seed? Pentru determinism și auditabilitate. SHAKE256 este o primitivă criptografică standardizată cu o specificație bine definită, ceea ce înseamnă că implementările independente în orice limbaj de programare vor genera rezultate identice pornind de la aceeași intrare. Un PRNG personalizat introduce un comportament definit de implementare, ceea ce îngreunează verificarea de către terți.

Poate un jucător să exploateze sistemul alegând un seed de client favorabil? În principiu, da – un jucător ar putea testa diferite seed-uri de client pentru a găsi unul care să genereze o grilă favorabilă. Acest lucru este considerat acceptabil în cadrul modelului: dreptul jucătorului de a-și alege seed-ul este o caracteristică, nu o vulnerabilitate. Expunerea cazinoului este simetrică și, ceea ce este esențial, același mecanism care permite unui jucător să aleagă un seed bun îi permite și să demonstreze că seed-ul cazinoului nu a fost manipulat.

Jocul Mines oferă o introducere accesibilă în domeniul proiectării demonstrabil corecte, tocmai pentru că procesul său de generare a numerelor aleatorii (RNG) este relativ autonom: un singur ciclu de angajament-dezvăluire, un flux de byți simplu și o tehnică de eșantionare ușor de înțeles. Pe măsură ce seria avansează, vom vedea cum alte jocuri din seria Cloudbet Originals adaptează și extind aceste fundamente – uneori cu surse suplimentare de entropie, diferite moduri de generare a rezultatelor sau verificări în mai multe etape – menținând totodată aceeași garanție esențială: faptul că niciun rezultat nu poate fi stabilit după ce jucătorul și-a luat angajamentul pentru o acțiune.

Share this post


You may also like

Descoperă cazinoul și casa noastră de pariuri sportive în practică
Cloudbet Academy
Get smarter
Get rewarded

Complete free Academy lessons and earn exclusive promo codes.

Premier League
Piețele sunt live