Rechne uns nach
Jede Kartenfolge in diesem Spiel steht fest, bevor die erste Karte fällt. Auf dieser Seite leitest du sie selbst ab — aus dem Server-Seed, dem Client-Seed und der Nonce. Stimmt deine Folge mit dem überein, was am Tisch passiert ist, war nichts gedreht.
Gerechnet wird auf deinem Gerät. Diese Seite fragt den Server nur nach den Eingaben — die sind öffentlich. Die Karten leitet sie hier ab, mit WebCrypto. Ein Server, der seine eigene Fairness bestätigt, beweist nichts.
Selbsttest dieser Seite
Läuft …— Prüfungen bestanden
Diese Seite rechnet das Mischverfahren nach, das auf dem Server in TypeScript steht. Zwei Umsetzungen desselben Verfahrens können auseinanderlaufen — deshalb prüft sie sich beim Laden gegen feste Testvektoren aus der Serverbibliothek. Erst wenn das stimmt, gibt sie die Eingabefelder frei.
Eingaben vom Server holen
Optional. Trage die Schuh- oder Rundenkennung ein, die am Tisch unter „Nachweis“ steht — dann füllen sich die Felder unten. Der Server liefert dabei ausschließlich die öffentlichen Eingaben. Läuft der Schuh noch, gibt er den Seed nicht heraus, und dann kannst du auch hier nichts ableiten. Das ist Absicht: ein zu früh veröffentlichter Seed macht den laufenden Schuh wertlos.
Fall 1 — Freie Runde
Der gewöhnliche Schuh am Casual- und Ranked-Tisch. Aus Server-Seed, Client-Seed und Nonce entsteht die komplette Kartenfolge, dazu die Position der Cut-Card.
Fall 2 — Turnierhand
Im Turnier bekommt jede Hand ihren eigenen Teil-Schuh, abgeleitet aus Turnier-Seed, Turnierkennung und Handindex. Deshalb sehen alle Bahnen in Hand k dieselben Karten — egal, wie viele Karten sie in Hand k−1 verbraucht haben. Das ist der Grund, warum ein Turnier Entscheidungen misst und nicht Glück.
Die ersten vier Karten sind gekennzeichnet: eine Turnierbahn ist immer einsitzig, deshalb ist die Reihenfolge eindeutig — Spieler, Dealer offen, Spieler, Dealer verdeckt.
Warum das trägt
Erst festlegen, dann austeilen, dann aufdecken
-
1
Festlegen. Bevor die erste Karte fällt, zieht der Server 32 zufällige Bytes — den Server-Seed — und veröffentlicht nur dessen SHA-256. Diesen Hash siehst du am Tisch, solange der Schuh läuft.
-
2
Austeilen. Die Kartenfolge ist keine Entscheidung mehr, sondern eine Rechnung: Sie folgt zwingend aus Server-Seed, Client-Seed und Nonce. Auch die Cut-Card kommt aus demselben Seed — sonst könnte der Betreiber nachträglich bestimmen, wie tief ein Schuh gespielt wird.
-
3
Aufdecken. Ist der Schuh durch und neu gemischt, gibt der Server den alten Seed frei. Im Turnier passiert das erst nach der letzten Hand — dort steckt im einen Seed das ganze Turnier.
-
4
Nachrechnen. Du prüfst zweierlei: Ergibt SHA-256 des freigegebenen Seeds genau den Hash von vorhin? Und ergibt der Seed genau die Karten, die gefallen sind? Beides machst du hier oben.
Woran ein Betrug scheitern würde
- „Der Betreiber sucht sich die Karten aus, nachdem er die Einsätze sieht.“
- Dazu bräuchte er einen anderen Server-Seed. Der Hash war aber schon veröffentlicht, und zu einem gegebenen SHA-256 einen passenden zweiten Seed zu finden, ist ein Urbildangriff auf SHA-256. Dafür ist nichts bekannt, was in Menschenzeit fertig würde. Durchprobieren scheidet ebenfalls aus: der Seed sind 32 zufällige Bytes.
- „Er behält den Seed und teilt trotzdem andere Karten aus.“
- Dann passt die abgeleitete Folge nicht zu den Karten, die am Tisch lagen — und genau das siehst du hier, Karte für Karte, mit Position.
- „Er verschiebt die Cut-Card, wenn der Schuh gerade schlecht für ihn läuft.“
- Die Cut-Card wird aus demselben Strom gezogen, direkt nach dem Mischen. Sie steht damit schon im Hash fest. Diese Seite rechnet sie mit aus.
- „Im Turnier kennt er vorab jede Karte.“
- Kennen ja — ändern nein, denn der Hash bindet ihn vor Anmeldeschluss. Deshalb ist beim Turnier die Geheimhaltung des Seeds bis zum Schluss keine Vorsicht, sondern Bedingung: Aus dem einen Seed folgt jede Hand des ganzen Turniers. Wer ihn vorzeitig hätte, würde nicht mehr spielen, sondern ablesen.
Das Verfahren in Worten
Kurz genug, um es in einer beliebigen Sprache selbst nachzubauen — und genau dafür steht es hier:
-
Lege den geordneten Stapel an: je Deck die Farben in der Reihenfolge Pik, Herz, Karo, Kreuz, darin die
Ränge A, 2, 3, 4, 5, 6, 7, 8, 9, 10, Bube, Dame, König. Eine Karte ist „Rang+Farbe“, etwa
ASoderTD. -
Erzeuge einen Bytestrom: Block c ist
HMAC-SHA256(serverSeed, clientSeed + ":" + nonce + ":" + c), beginnend bei c = 0. Der Server-Seed geht als 64-Zeichen-Text in den Schlüssel, nicht als dekodierte Bytes. Sind die 32 Byte eines Blocks verbraucht, folgt der nächste. -
Brauchst du einen Index in
[0, n), nimm so viele Bytes k, dass256^k ≥ n, lies sie als Zahl in Big-Endian und verwirf alles ab256^k − (256^k mod n). Erst dannmod n. Ohne dieses Verwerfen wären kleine Indizes häufiger — bei 52 Karten um ein Viertel. -
Mische mit Fisher-Yates rückwärts: für i von der letzten Position bis 1 ziehe
j aus
[0, i+1)und vertausche die Karten an i und j. -
Die Cut-Card kommt aus demselben Strom, unmittelbar danach:
base = round(gesamt × durchdringung),streuung = max(1, round(gesamt × 0,02)), dazu ein Index aus[0, 2×streuung+1)minusstreuung; das Ergebnis wird auf[max(20, round(gesamt × 0,5)), gesamt − 15]begrenzt. -
Index 0 ist die zuerst gezogene Karte. Für eine Turnierhand setze
clientSeed = turnierkennung + ":" + handindexundnonce = handindex— sonst ändert sich nichts.
Was diese Seite nicht beweist
- Der Hash muss vorher bei dir angekommen sein. Wer erst nach der Runde nachliest, was angeblich vorher veröffentlicht wurde, prüft die Erzählung des Betreibers, nicht seine Bindung. Notiere dir den Hash am Tisch, bevor du setzt — dann ist die Prüfung hier lückenlos.
- Diese Seite kommt von uns. Das ist der wunde Punkt jeder Prüfseite. Deshalb steht das Verfahren oben vollständig da: Bau es nach, in der Sprache deiner Wahl. Oder speichere diese Datei und öffne sie offline — sie lädt nichts nach und rechnet ohne Netz, sobald die Felder gefüllt sind.
- Geprüft wird die Mischung, nicht die Kasse. Ob eine Hand richtig ausgewertet und richtig abgerechnet wurde, ist eine andere Frage als die, welche Karten kamen.
- Prüfe mehr als eine Runde. Eine einzelne nachgerechnete Runde zeigt, dass diese eine stimmte. Überzeugend wird es, wenn du dir über Tage Hashes notierst und sie später alle auflöst.