Atout!

Donne vérifiable

Verifiable deal · personne ne peut choisir vos cartes, pas même nous

Comment ça marche

  1. Avant la donne, le serveur choisit un secret au hasard et montre seulement son empreinte (SHA-256). Une empreinte ne permet pas de retrouver le secret, mais elle l'engage : il ne peut plus changer.
  2. Votre appareil envoie alors un nombre au hasard qu'il est le seul à connaître. Le serveur ne pouvait pas le deviner en choisissant son secret.
  3. Le paquet est mélangé à partir du secret et des nombres de tous les joueurs. Personne, pas même nous, ne peut donc choisir la donne.
  4. Après la donne, le secret est révélé. L'appli vérifie seule que l'empreinte correspond, que votre nombre a servi, que le mélange redonne le même paquet et que vos cartes viennent bien de ce paquet. Un bouclier vert s'affiche à la table ; cette page refait le même calcul, dans votre navigateur.

Ce que cela ne prouve pas

Les robots jouent sur le serveur. La donne vérifiable prouve que les cartes n'ont pas été choisies ; elle ne peut pas prouver qu'un robot ne regarde pas vos cartes. Ils ne le font pas : chaque robot ne reçoit que sa propre main, et nos tests vérifient qu'aucune place ne voit les cartes d'une autre.

Le calcul exact

Texte = atout-v1|secret|nombre place 0|nombre place 1|… (vide pour un robot). Clé = SHA-256 du texte, en hexadécimal. Nombres = blocs de 4 octets (gros-boutiste) de SHA-256(clé:0), SHA-256(clé:1)… Paquet de départ : trèfle, carreau, cœur, pique, chacun du 7 à l'as. Pour i de 31 à 1 : on tire des nombres jusqu'à en avoir un sous 2³² − (2³² mod (i+1)), j = ce nombre mod (i+1), on échange les cartes i et j.

Distribution. Coinche : une carte à la fois, de la place 0 à la place 3. Belote : 5 cartes chacun en commençant à droite du donneur, la 21e est retournée, le reste après la prise (2 pour le preneur, 3 pour les autres). Duo : quatre paquets de 4 cachés puis quatre visibles, receveur d'abord.


How it works

  1. Before the deal, the server picks a random secret and shows only its fingerprint (SHA-256). The fingerprint doesn't give the secret away, but it locks it in: it can't change any more.
  2. Your device then sends a random number only it knows. The server couldn't have guessed it when it chose its secret.
  3. The deck is shuffled from the secret and every player's number, so nobody, not even us, can choose the deal.
  4. After the hand, the secret is revealed. The app checks by itself that the fingerprint matches, that your number was used, that the shuffle gives the same deck, and that your cards came from that deck. A green shield shows at the table; this page does the same calculation, in your browser.

What it doesn't prove

Robots play on the server. A verifiable deal proves the cards weren't chosen; it can't prove a robot isn't looking at your cards. They don't: each robot only gets its own hand, and our tests check that no seat can see another seat's cards.

The exact calculation

Text = atout-v1|secret|seat 0 number|seat 1 number|… (empty for a robot). Key = SHA-256 of the text, in hex. Numbers = 4-byte big-endian chunks of SHA-256(key:0), SHA-256(key:1)… Starting deck: clubs, diamonds, hearts, spades, each from 7 to ace. For i from 31 down to 1: draw numbers until one is below 2³² − (2³² mod (i+1)), j = that number mod (i+1), swap cards i and j.

Dealing. Coinche: one card at a time, seat 0 to seat 3. Belote: 5 cards each starting right of the dealer, the 21st is turned up, the rest after the taking (2 for the taker, 3 for the others). Duo: four packets of 4 face down, then four face up, receiver first.