Pokerni: Chips ohne Geldwert, nicht kaufbar, nicht umwandelbar, nicht übertragbar; KI-Gegner sind mit einem Abzeichen gekennzeichnet. Da das Haus die Gegner stellt, schulden wir Ihnen volle Transparenz beim Geben.
Die Berechnung läuft vollständig in Ihrem Browser; nichts wird an den Server gesendet. Dieser Browser behält den vor der Hand empfangenen Fingerabdruck und den danach empfangenen Seed; wenn Sie angemeldet sind, wird auch Ihr Handverlauf abgefragt. Sie können die beiden Werte auch selbst einfügen: am Tisch erscheint der Fingerabdruck, wenn Sie mit der Maus über das Abzeichen „Überprüfbares Geben“ fahren.
Was diese Prüfung beweist: dass der vor der ersten Karte veröffentlichte Fingerabdruck tatsächlich zu dem nach der letzten Karte bekanntgegebenen Seed gehört. Der Stapel stand also fest, bevor Sie eine einzige Karte gesehen haben, und niemand konnte ihn während der Hand ändern.
Was sie nicht beweist: die genaue Reihenfolge der 52 Karten, die aus dem Seed folgt. Dieses Mischen nutzt den Generator von NumPy, den der Browser nicht nachspielen kann; das Python-Skript der technischen Fassung baut sie Karte für Karte nach.
KI-Gegner tragen an ihrem Platz dauerhaft das Abzeichen IA, zusammen mit ihrer Stufe. Eine KI erhält genau dieselben Informationen wie ein menschlicher Spieler an ihrer Stelle: ihre zwei Karten, die Gemeinschaftskarten und die öffentlichen Aktionen; niemals die Karten der anderen oder die noch kommenden Karten. Der Code des Gebens ist überprüfbar, wie oben erklärt. Der Coach ist ein automatisiertes System: seine Ratschläge berechnet ein Programm, nie eine Person, allein aus Ihren Karten und den öffentlichen Aktionen.
Vor jeder Hand zieht der Server einen 63-Bit-Seed mit dem kryptographischen Generator des Systems (secrets.randbits(63) in Python, unvorhersehbar, auch für uns). Dieser Seed steuert eine deterministische Permutation der 52 Karten (numpy.random.default_rng(seed).permutation(52)). Die zwei Karten jedes Spielers und dann die 5 Gemeinschaftskarten werden in der Reihenfolge des Stapels ausgeteilt, ohne Burn Cards.
Der Server kann die Karten während einer Hand nicht ändern, und er beweist es:
1. Vor der Hand enthält jede Zustandsnachricht eine Festlegung: commit = SHA-256("selfpoker:" + seed). Der Fingerabdruck legt den kompletten Stapel fest, ohne etwas zu verraten.
2. Nach der Hand gibt die Abschlussnachricht (hand_end) den Seed bekannt. Jeder kann dann prüfen, dass der Fingerabdruck passt, und den ganzen Stapel nachbauen, einschließlich der nicht ausgeteilten Karten.
import hashlib
import numpy as np
graine = 1234567890123456789 # Feld "fairplay.seed" von hand_end
commit = "..." # Feld "commit" der Zustandsnachrichten
assert hashlib.sha256(f"selfpoker:{graine}".encode()).hexdigest() == commit
paquet = list(np.random.default_rng(graine).permutation(52))
# n Spieler: Karten 0..2n-1 = Hände (2 pro Spieler), 2n..2n+4 = Gemeinschaftskarten
# Wert = Karte // 4 (0=2 … 12=Ass), Farbe = Karte % 4 (♣♦♥♠)
Jede gespielte Hand wird mit ihrem Seed archiviert: der gesamte Verlauf lässt sich identisch nachspielen.
Fragen? Der Servercode kann auf dem Rechner eingesehen werden, der ihn hostet: dies ist eine private Seite unter Leuten, die einander vertrauen.
Hintergrundmusik: Jason Shaw, audionautix.com, Lizenz Creative Commons BY 4.0 (« Big Swing Band », « Closer To Jazz », « Dirt Road Traveler », « Nice And Easy », « Acoustic Rock », « Feel Good Rock »).