Würfel, für die du uns nicht glauben musst
Vor dem Spiel legen wir eine geheime Zahl fest und veröffentlichen ihren Fingerabdruck. Am Ende veröffentlichen wir die Zahl selbst. Zwischen diesen beiden Momenten steht jeder Würfel bereits fest — und danach kann jeder alle nachrechnen und prüfen, dass sich nichts verschoben hat.
Das Register öffnenDer Teil, den auch ein guter Zufallsgenerator nicht löst
Unsere Würfel kommen aus dem kryptografischen Generator des Betriebssystems — derselben Quelle, die ein Bank-Login schützt, nicht der Abkürzung, die die meisten Spiele nehmen. Damit ist geklärt, wie zufällig die Zahlen sind. Über die Frage, die Spieler tatsächlich stellen, sagt es nichts.
Ein ehrlich gezogener und ein absichtlich gewählter Würfel sehen hinterher gleich aus. Beides ist nur eine Zahl in einem Protokoll.
Die nützliche Frage lautet also nicht "ist euer Generator gut?", sondern "kann ich es überprüfen?" Alles Weitere ist dafür da, diese Antwort zu einem Ja zu machen — ohne dass du uns ein einziges Wort glauben musst.
Vorher versiegelt, danach geöffnet
Vier Schritte. Zwei davon kannst du selbst ausführen, und genau diese zwei würden uns überführen.
- 1
Versiegeln
Vor dem ersten Wurf zieht der Server eine geheime 32-Byte-Zahl — den Server-Startwert — und veröffentlicht deren SHA-256-Fingerabdruck an beide Spieler. Der Fingerabdruck verrät nichts, aber der Startwert steht jetzt fest: jeder andere ergäbe einen anderen Fingerabdruck.
commit0df0916cb0…2904e706 - 2
Mischen
Deine App erzeugt einen eigenen Zufallswert und schickt ihn mit, wenn du dich an den Tisch setzt. Die Werte beider Spieler fließen in jeden Würfel. Wir können also nicht vorab nach einem Startwert suchen, dessen Würfe uns passen — im Moment der Festlegung wissen wir nicht, was du beitragen wirst.
clientSeeda26460084a0ef89b:d4f28bac6efd1b6e - 3
Ableiten
Jeder Würfel wird aus einem HMAC-SHA256 der Startwerte und der Wurfnummer gelesen. Nichts wird gespeichert und nichts ausgewählt: dieselben drei Eingaben ergeben immer denselben Würfel, und keine andere Eingabe ergibt ihn.
die(n) = (HMAC-SHA256(serverSeed, "clientSeed:n:round")[0] < 252) % 6 + 1 - 4
Öffnen
Am Spielende veröffentlichen wir den Server-Startwert. Hashe ihn, vergleiche mit dem Fingerabdruck, den du vor dem ersten Wurf bekommen hast, und rechne dann jeden Würfel nach. Ein Server, der auch nur einen Wurf gewählt hätte, fällt bei einer dieser beiden Prüfungen durch.
serverSeed5cde3365be…7b6b2bd5
Die Werte oben sind der echte Nachweis von Spiel #148, einem beendeten Spiel, das jeder nachschlagen kann. Trag die Nummer unten ein und sieh zu, wie sie aufgeht.
Ein Spiel prüfen — hier, jetzt
Gib eine Spielnummer ein. Die Seite holt den Nachweis, hasht dann den Startwert neu und berechnet jeden Würfel mit der Kryptografie deines eigenen Browsers.
Oder die drei Werte selbst einfügen
Der offengelegte Startwert passt zum Fingerabdruck
Würfel reproduziert
Kein Nachweis unter dieser Nummer. Spiele werden in der Reihenfolge ihres Endes nummeriert, und nur ein beendetes Spiel hat einen veröffentlichten Startwert.
Der Nachweis konnte nicht geladen werden. Das ist ein Verbindungsproblem, keine fehlgeschlagene Prüfung — widerlegt ist nichts.
Das ist keine Spielnummer, oder die eingefügten Werte sind nicht zwei 64-stellige Hashes und ein Client-Startwert.
Wird berechnet…
Warum keine Augenzahl auch nur minimal wahrscheinlicher ist
Ein Byte ist eine Zahl von 0 bis 255 — 256 Möglichkeiten. 256 ist kein Vielfaches von sechs; es ist 6 × 42, Rest 4. Nimmt man den Rest der Division durch sechs, bekommen vier Augenzahlen still 43 von 256 Chancen und die anderen zwei nur 42. Eine winzige Verzerrung — über eine Million Würfe ein echter Vorteil. Also werden diese vier Werte verworfen.
252 = 6 × 42. Jede Augenzahl bekommt exakt gleich viele Bytes, also ist jede exakt eine von sechs.
Wo der Nachweis endet
Zwei Arten von Würfeln auf dieser Seite deckt die Kette nicht ab. Sie stehen hier, statt wegzufallen, denn eine Fairness-Behauptung mit einem stillen Loch ist weniger wert als gar keine.
- TelegramWürfe im Bot-ChatWürfelst du mit Telegrams eigener Würfelanimation, kommt diese Zahl von Telegram und nicht von uns; kein Startwert von uns reproduziert sie. Der veröffentlichte Nachweis listet genau diese Positionen, und das Register zeigt dort das Telegram-Zeichen statt einer Augenzahl. Für ein vollständig prüfbares Spiel würfle in der App.
- ÜbungSpiele gegen den ComputerDas Offline-Übungsspiel würfelt auf deinem eigenen Gerät, ohne Startwert und ohne Nachweis. Es gibt keinen Gegner und keinen Einsatz, also nichts zu beweisen und nichts zu verlieren.
Alles andere — Online-1v1, Freundesräume und Turniere, kostenlos oder mit Einsatz — läuft über die oben beschriebene Kette.
Dieselbe Prüfung, ohne diese Seite
Zwölf Zeilen, keine Bibliothek. Füge sie mit den drei Werten eines Spiels in eine beliebige Browser-Konsole ein, und sie sagt dir genau das, was diese Seite sagt — dafür veröffentlicht man die Methode und nicht nur das Ergebnis.
const enc = new TextEncoder();
const hex = (b) => [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, '0')).join('');
// 1. the seed we revealed must hash to the commitment you were given first
const commitOk = hex(await crypto.subtle.digest('SHA-256', enc.encode(serverSeed))) === commit;
// 2. every die, re-derived from that seed
const key = await crypto.subtle.importKey(
'raw', enc.encode(serverSeed), { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']);
async function die(n) {
for (let round = 0; round < 16; round++) {
const mac = new Uint8Array(
await crypto.subtle.sign('HMAC', key, enc.encode(`${clientSeed}:${n}:${round}`)));
for (const b of mac) if (b < 252) return (b % 6) + 1;
}
}Jeder Nachweis ist öffentlich unter /fair/<id> — kein Schlüssel, kein Konto, keine Spielernamen, keine Beträge. Nur die Würfel.
Fragen, die wirklich gestellt werden
Ich habe vier Spiele in Folge verloren. Sind die Würfel gegen mich?+
Das können sie nicht sein. Jeder Würfel eines beendeten Spiels stand vor dessen Beginn fest, durch einen vorab festgelegten Startwert, und du kannst sie oben alle nachrechnen. Serien fühlen sich gezielt an und sind es nicht: mit zwei Würfeln passiert es weit häufiger als gedacht, dass ein Gegner vier Spiele lang besser würfelt.
Könnte der Server im entscheidenden Moment einen Wurf wählen?+
Er müsste eine von zwei Prüfungen brechen. Entweder veröffentlicht er einen Startwert, der nicht zu dem Fingerabdruck passt, den du vor dem Spiel bekommen hast — das sieht jeder — oder er veröffentlicht den echten, und dann sind die Würfel, die dieser erzeugt, genau die, die du gespielt hast.
Was, wenn meine App nie einen eigenen Startwert geschickt hat?+
Dann wird an seiner Stelle ein zufälliger erzeugt, damit die Kette immer wohlgeformt ist. Das schwächt nur deinen eigenen Beitrag; die Festlegung und alle Prüfungen oben gelten weiter.
Beeinflusst ein offengelegter Startwert mein nächstes Spiel?+
Nein. Für jedes Spiel — auch für eine Revanche — wird ein neuer Startwert gezogen und ein neuer Fingerabdruck veröffentlicht. Ein veröffentlichter Startwert entscheidet nie wieder einen Wurf.
Warum tragen manche Würfel das Telegram-Zeichen?+
Sie wurden mit Telegrams Würfelanimation im Bot-Chat geworfen, kamen also von Telegram, und kein Startwert von uns reproduziert sie. Sie werden markiert statt versteckt, und die Zahl, die unsere Kette an dieser Stelle ergeben hätte, wird bewusst nicht gezeigt — sie ist nicht der Würfel, den jemand geworfen hat.