Cloudbet.com entdecken
certified checkmark stamp next to cloudbet logo

Wie das Provably Fair Mines-Spiel von Cloudbet funktioniert – Eine technische Erklärung


Nachweislich faires Glücksspiel löst ein Problem, das Online-Casinos seit ihren Anfängen begleitet: Wie kann ein Spieler darauf vertrauen, dass ein Spielergebnis nicht nachträglich manipuliert wurde? Die Antwort, wie sich herausstellt, ist dasselbe Werkzeug, das Kryptographen verwenden, wenn zwei Parteien sich einigen müssen, ohne einander zu vertrauen – ein Commit-Reveal-Verfahren.

Im Folgenden wird der gesamte Ablauf der Pipeline, die Cloudbet für sein Mines-Spiel verwendet, detailliert beschrieben – von der Generierung des Startwerts bis zur Platzierung der Minen – und wie jeder Spieler mit ein wenig Programmierkenntnissen jedes Ergebnis, das er jemals gespielt hat, unabhängig überprüfen kann.

Dieser Artikel ist der erste einer geplanten Reihe technischer Analysen der nachweislich fairen Mechanismen von Cloudbet Originals. Um jede Runde (einschließlich Mines) selbst zu überprüfen, nutze den Cloudbet Provably Fair-Rechner.

Festlegen auf das Ergebnis vor Spielbeginn

Vor jeder Runde generiert der Server einen zufälligen 32-Byte-Server-Seed und veröffentlicht sofort dessen SHA3-256-Hash – das Commitment. Dieser Hash ist ein Einweg-Fingerabdruck: Er beweist, dass der Seed zu diesem Zeitpunkt existierte, ohne dessen Zweck preiszugeben.

Sobald das Spiel beendet ist, gibt Cloudbet den Server-Seed bekannt. Jeder kann einen Hash-Wert davon berechnen und bestätigen, dass er mit der vor Spielbeginn getroffenen Vereinbarung übereinstimmt. Dies beweist, dass der Seed – und damit das Minenlayout – vor der Auswahl des ersten Feldes festgelegt war. Es gibt keinen Zeitpunkt, zu dem das Casino es gegen einen günstigeren Wert eintauschen könnte.

Einbeziehung der Spielerentropie

Der Server-Seed allein würde die Spieler vollständig von der Zufälligkeit des Casinos abhängig machen. Um dies zu verhindern, werden zwei zusätzliche Eingaben eingeführt: ein Client-Seed (vom Spieler festgelegt) und eine Nonce (eine ganze Zahl, die sich mit jedem Einsatz erhöht).

Alle drei Werte werden verkettet und mit SHA3-256 gehasht, um die Rundensignatur zu erzeugen:

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

Der Client-Seed stellt sicher, dass das Casino den Ausgang zum Zeitpunkt der Einsatzfestlegung nicht vorhersagen kann, da die Eingabe des Spielers bei der Generierung des Server-Seeds unbekannt ist. Die Nonce gewährleistet, dass jede Runde eine eindeutige Signatur erzeugt, selbst wenn beide Seeds zwischen den Einsätzen unverändert bleiben.

Generierung von Zufallzahlen mit SHAKE256

Die Rundensignatur wird in SHAKE256, eine erweiterbare Ausgabefunktion (XOF) aus der SHA-3-Familie, eingespeist. Im Gegensatz zu einem Standard-Hash kann eine XOF aus einer festen Eingabe einen beliebig langen, pseudozufälligen Bytestrom erzeugen. Das ist in diesem Fall nützlich, da das Platzieren mehrerer Minen mehrere unabhängige Zufallswerte erfordert.

Die Implementierung liest jeweils 4 Bytes aus dem Datenstrom. Sobald die anfängliche Ausgabe erschöpft ist, wird dem Zustand „next“ angehängt und der Vorgang wiederholt. In der Praxis bleibt ein Raster mit 25 Feldern und einer realistischen Anzahl an Minen jedoch deutlich innerhalb der ersten 256 Bits.

Unvoreingenommene Platzierung von Minen: Ablehnungsstichprobe

Die Umwandlung einer zufälligen 32-Bit-Ganzzahl in eine Rasterposition mittels einer einfachen Modulo-Operation führt zu einem subtilen, aber realen Problem: Sofern 2^32 nicht durch die Anzahl der verbleibenden Positionen P teilbar ist, werden einige Positionen geringfügig wahrscheinlicher sein als andere.

Cloudbet beseitigt dieses Problem durch Ablehnungsstichproben:

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

Jeder Wert, der außerhalb des größten Vielfachen von P liegt und in 32 Bit passt, wird verworfen, und stattdessen wird der nächste Wert aus dem SHAKE256-Datenstrom gezogen. Übrig bleibt eine Gleichverteilung über genau P Positionen.

Nach dem Platzieren jeder Mine wird diese Position aus dem Pool entfernt und P um 1 verringert – ein partielles Fisher-Yates-Shuffle über das flache 25-Elemente-Gitter.

Überprüfung einer Runde

Für die Verifizierung nach dem Spiel werden vier Werte benötigt, die alle von Cloudbet nach der Runde veröffentlicht werden:

  • serverSeed
  • clientSeed
  • nonce
  • Die deklarierten minePositions

Die Verifizierungsschritte sind wie folgt:

  1. Erstelle mit SHA3-256 einen Hash serverSeed und überprüfe, ob dieser mit dem vor Spielbeginn festgelegten Commitment übereinstimmt.
  2. Berechne roundSignature = SHA3-256(serverSeed:clientSeed:nonce).
  3. Initialisiere den SHAKE256-Stream mit roundSignature und führe die Ablehnungsstichproben-Schleife aus, um minePositions unabhängig zu reproduzieren .

Eine Übereinstimmung bestätigt, dass das Raster nach Beginn der Runde nicht verändert wurde.

Beispielimplementierung (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);

Was du beachten solltest

Warum SHA3 statt SHA2? Für eine einfache Commitment-Erzeugung wären beide geeignet. Die Sponge-Konstruktion von SHA3 verhindert Längenverlängerungsangriffe, während die durchgängige Verwendung – sowohl für die Commitment-Operation als auch als Grundlage für SHAKE256 – eine konsistente kryptografische Oberfläche gewährleistet.

Warum SHAKE256 statt eines PRNG mit Seed? Determinismus und Nachvollziehbarkeit. SHAKE256 ist ein standardisiertes Primitiv mit einer klar definierten Spezifikation. Das bedeutet, dass unabhängige Implementierungen in jeder Programmiersprache bei gleicher Eingabe identische Ergebnisse liefern. Ein benutzerdefinierter PRNG hingegen führt zu implementierungsabhängigem Verhalten, was die Überprüfung durch Dritte erschwert.

Kann ein Spieler das System austricksen, indem er einen günstigen Client-Seed wählt?
Im Prinzip ja – ein Spieler könnte verschiedene Client-Seeds ausprobieren, um einen zu finden, der ein günstiges Raster erzeugt. Dies ist im Systemdesign zulässig: Das Recht des Spielers, seinen Seed selbst zu wählen, ist eine Funktion, keine Schwachstelle. Das Risiko für das Casino ist symmetrisch, und entscheidend ist, dass derselbe Mechanismus, der es einem Spieler ermöglicht, einen guten Seed auszuwählen, ihm auch erlaubt zu beweisen, dass das Casino seinen Seed niemals manipuliert hat.

Das Spiel „Mines“ bietet einen idealen Einstieg in nachweislich faires Spieldesign, da sein Zufallsgenerator relativ in sich abgeschlossen ist: ein einziger Commit-Reveal-Zyklus, ein einfacher Byte-Stream und ein gut verstandenes Sampling-Verfahren. Im weiteren Verlauf der Reihe werden wir sehen, wie andere Cloudbet Originals diese Grundlagen anpassen und erweitern – manchmal mit zusätzlichen Entropiequellen, anderen Ausgabemappings oder mehrstufiger Verifizierung –, wobei die Kerngarantie erhalten bleibt: dass kein Ergebnis mehr feststeht, nachdem der Spieler seine Aktion ausgeführt hat.

Share this post


You may also like

Schau dir unser Casino und unsere Sportwetten in Aktion
Cloudbet Academy
Get smarter
Get rewarded

Complete free Academy lessons and earn exclusive promo codes.