La quatrième entrée
Chaque explication du jeu provably fair, y compris la nôtre, nomme trois entrées : une graine serveur à laquelle la maison s'engage à l'avance, une graine client que vous pouvez définir vous-même, et un nonce qui augmente de un à chaque mise. Alimentez-les dans un hash à clé et vous obtenez le caractère aléatoire du tour. Cette description est complète pour un tirage au sort. Elle est incomplète pour presque tout le reste, car un hash produit un nombre et la plupart des jeux en ont besoin de plusieurs.
La quatrième entrée est le curseur. Sur ce site, le message qui est hashé n'est pas « graine client-nonce » mais « graine client-nonce-curseur », et le curseur est un compteur à l'intérieur du tour : 0 pour le premier nombre aléatoire dont le jeu a besoin, 1 pour le deuxième, et ainsi de suite. Chaque valeur de curseur donne un digest 256-bit frais, sans rapport avec ses voisins d'une manière que vous pourriez exploiter, et le moteur lit les huit premiers octets de chaque digest comme un nombre entre 0 et 1.
ENGINE-VERIFIED_shared/demoLocal.ts: uAt(pair, cursor) returns u64(HMAC-SHA256(serverSeed, `${clientSeed}-${nonce}-${cursor}`)), described as matching the server’s RandomUtils.generateHash(“clientSeed-nonce-cursor”). _shared/rng.ts: u64 reads the first eight bytes of the digest as hi/2^32 + lo/2^64, “the same single-rounding construction” as the server’s ULong→Double conversion. The nonce is one stream per seed pair across all games: each bet consumes the current nonce and stores nonce + 1.
Un tour n'est donc pas un seul nombre aléatoire mais une liste numérotée d'entre eux, aussi longue que le jeu en a besoin, et chaque entrée de la liste est fixée l'instant où la paire de graines et le nonce sont définis. Le jeu ne tire pas au fur et à mesure. Il lit une liste qui existe déjà.
Ce que chaque jeu lit
La partie intéressante est que la liste est différente pour chaque jeu, et chaque module de dérivation énonce sa structure dans son en-tête. Voici le flux de curseur de chaque original qui tire de la paire de graines, extrait de la source du moteur.
| JEU | CURSEURS LUS | CE QU'ILS DEVIENNENT |
|---|---|---|
| Limbo | 0 | Un nombre passant par la courbe 0,99 ÷ (1 − u) |
| Roulette | 0 | La poche : floor(u × 37) |
| Fukubukuro | 0 | L'article, selon la table de poids du sac |
| Sic Bo | 0, 1, 2 | Les trois dés |
| Chinchiro | face × 9 + tentative × 3 + dé | Jusqu'à 18 : croupier puis joueur, jusqu'à trois lancers de trois dés chacun ; un lancer qui fait une main termine la face |
| Koban Flip | une par tirage | Le tirage i lit le curseur i ; chaque face de la roue est fixée lors de l'achat de la première pièce |
| Omikuji | 0, puis 1–3, puis 4 et au-delà | Niveau de fortune ; les trois cellules gagnantes en cas de victoire ; glyphes de remplissage pour le reste |
| Pagoda | un par étage | La tuile piège à chaque étage : floor(u × tuiles) |
| Video Poker | 5, plus une par carte remplacée | Une séquence sans remplacement sur 52 cartes ; garder tout et aucun curseur supplémentaire n'est lu |
| Casino Hold'em | jusqu'à 9 | joueur 1, joueur 2, croupier 1, croupier 2, flop 1–3, turn, river; le turn et river ne sont lus que sur CALL |
| Blackjack | un par carte | Sabot infini, carte = floor(u × 52), dans l'ordre de distribution : joueur, croupier visible, joueur, croupier caché, puis chaque tirage supplémentaire |
| Andar Bahar | 0–4, puis un par carte tirée | Deux buckets boostés, leurs magnitudes, le joker, puis la course jusqu'à ce que le rang se répète |
| Hanabi | 15 par spin | Cellule = bobine × 3 + ligne; le free spin j lit 15 + 15j onwards |
| Bingo | 0–24, puis 25–62 | La carte, cinq tirages par colonne; puis les 38 boules |
Keno et Crash sont les exceptions : leurs démos utilisent une chaîne de hash par ticket plutôt que la paire seed-nonce, décrite ci-dessous. Mines et Plinko sont réglés par le service de la maison; l'API mines note que tout le layout provient d'un seul nonce.
ENGINE-VERIFIEDCommentaires d'en-tête dans bingo/derive.ts (« Cursor stream: 0..24 — la carte … 25..62 — les 38 boules »), hanabi/engine.ts (« base spin = cells 0..14 … free spin j = cells 15+15j .. 29+15j »), blackjack/derive.ts (« card i = floor(u × 52) au cursor i … Deal order (cursor): player1, dealer-up, player2, dealer-hole »), vpoker/derive.ts (« les cinq premières sont la distribution, les remplacements continuent la même séquence … Hold everything et aucun autre cursor n'est lu »), holdem/derive.ts (« player1, player2, dealer1, dealer2, flop1, flop2, flop3, turn, river. Les cursors turn/river ne sont consommés que sur CALL »), andar/derive.ts (cursors 0–4 puis « 5.. un cursor par carte tirée »), koban/derive.ts (« flip i lit cursor i »), sicbo/derive.ts (« cursors 0/1/2 sont les trois dés »), roulette/derive.ts (« cursor 0 seul décide la poche: floor(u × 37) »), fuku/derive.ts (« cursor 0 seul tire l'item »), omikuji/derive.ts (cursor 0 tier, 1..3 winning cells, 4.. fillers); demoLocal.ts rollSide (chinchiro cursor = side*9 + attempt*3 + d), trapAt (pagoda: the floor number is the cursor), demoLimboBet (uAt(p, 0)); mines/minesApi.ts (« le layout de mine entier provient de ce seul nonce »).
Trois choses se distinguent dans ce tableau. Premièrement, les jeux qui distribuent des cartes lisent un cursor par carte dans un ordre fixe, ce qui est pourquoi une main de blackjack peut être rejouée à partir de sa liste d'actions : votre décision de tirer ne crée pas une carte, elle découvre la suivante sur une liste qui était complète avant la distribution. Deuxièmement, plusieurs jeux cessent de lire tôt. Une main de video poker où vous conservez les cinq cartes ne touche jamais le cursor 5; un fold Hold'em ne lit jamais le turn ou river. Les chiffres étaient là; le jeu n'en avait pas besoin. Troisièmement, les deux buckets boostés dans Andar Bahar et le tier de fortune dans Omikuji sont tirés avant les cartes et cellules, en tête du flux, donc les caractéristiques spéciales du tour sont fixées par le même engagement que ses caractéristiques ordinaires.
Tirage sans remise
Un nombre uniforme entre 0 et 1 est facile à transformer en poche de roulette : multipliez par 37 et arrondissez vers le bas. Un sabot est plus difficile, car la deuxième carte ne doit pas être la première carte à nouveau. Le moteur gère cela avec ce que ses commentaires appellent un pool hop : gardez une liste des cartes toujours dans le pool, utilisez le numéro du cursor pour choisir une position dedans, et échangez la carte choisie à la fin de la liste pour que le prochain tirage ne choisisse qu'une de moins. Video Poker, Casino Hold'em, Andar Bahar et la carte Bingo tirent tous de cette façon, donc aucune carte ou numéro ne se répète au sein d'un tour.
Le Blackjack est l'exception délibérée. Son sabot est infini : chaque carte est floor(u × 52) de son propre cursor, et la même carte peut apparaître deux fois dans une main. C'est un choix de conception avec un coût publié, discuté dans l'article payout blackjack, et c'est exactement le genre de chose que le cursor layout vous dit qu'une page marketing ne dirait pas.
ENGINE-VERIFIEDvpoker/derive.ts: « Cards come from ONE without-replacement sequence over the 52-card deck (pool-hop, cursor per draw) ». holdem/derive.ts: « ONE without-replacement pool-hop sequence (cursor per draw) ». bingo/derive.ts: « five pool-hop draws per column » et « the 38 balls, pool-hops over 1..75 ». blackjack/derive.ts: « Infinite shoe: card i = floor(u × 52) at cursor i ».
Les deux exceptions
Keno et Crash ne lisent pas du tout la paire nonce de seed dans le moteur démo. Keno utilise un schéma par ticket : le ticket reçoit son propre hash aléatoire et un salt, et chacune des dix boules est tirée en hashant à nouveau le hash précédent, en prenant les bits de tête comme nombre et en piochant dans le pool rétrécissant de quarante. Le panneau d'équité vérifie un ticket keno à partir de ces deux chaînes plutôt qu'à partir de la paire de seed. Crash suit la convention bustabit, une chaîne de hashes où le crash point de chaque round est calculé à partir de son propre lien avec une arithmétique exacte d'entiers.
ENGINE-VERIFIEDdemoLocal.ts kenoDraws: “per-bet randomHash chain + salt (verifiable per ticket via the fairness modal) … Does not touch the seed-pair nonce”; the loop hashes HMAC-SHA256(salt, previous hash) ten times, reads the leading 52 bits and picks index floor(norm × remaining) from a 40-number pool with a swap to the end. rng.ts h52 and the crash comment: “bustabit crash point in hundredths: floor((n·e − h)/(e − h)), e = 2^52, n = 100 … Exact BigInt math to match the server”.
Aucune des deux exceptions n'est plus faible que le schéma de curseur ; les deux sont plus anciennes et mieux connues. Ce qui importe pour un joueur est seulement que le panneau montre quel schéma a été utilisé pour un round, et que chacun puisse être recalculé à partir des chaînes qu'il affiche.
Ce que cela signifie à la table
- Le round existe avant que vous n'agissiez. Chaque carte, boule et symbole de rouleau d'un round est une fonction de la paire de seed, du nonce et de sa position de curseur. Frapper, suivre ou garder choisit quelles entrées sont lues, pas ce qu'elles contiennent.
- Vos choix ne peuvent pas modifier la liste, et la maison non plus. Une fois que le seed serveur est engagé et le nonce fixé, personne d'aucun côté ne peut modifier l'entrée 7 sans modifier le seed, ce qui casserait l'empreinte digitale que vous avez vue.
- Un vérificateur doit lire la même liste de la même manière. Recalculer un round de bingo signifie dériver les 63 curseurs dans l'ordre publié ; recalculer un fold Hold'em signifie en dériver 7. Le panneau de seed le fait dans votre navigateur, et les layouts du tableau ci-dessus sont ce qu'il suit.
- Une série est une liste, pas une humeur. Deux rounds ne partagent rien d'autre que la paire de seed ; leurs nonces diffèrent et donc chaque digest diffère. C'est le même point que l'article sur la main chaude développe depuis l'autre direction.
Trois entrées décident du round. La quatrième décide de la durée du round. le curseur, en une ligne
Les layouts de curseur ci-dessus sont lus à partir des modules de dérivation côté client que le vérificateur du navigateur et le moteur démo partagent. Le service de la maison est l'autorité payante ; lorsqu'un commentaire dans le code source dit qu'un module reflète le serveur, cela est cité tel que écrit, pas certifié par nous.
FAQ
Qu'est-ce que le curseur dans un round provably fair ?
Un compteur à l'intérieur du round. Le message hashé avec le seed serveur est « client seed-nonce-cursor » ; le curseur 0 donne le premier nombre aléatoire dont le jeu a besoin, le curseur 1 le deuxième, et ainsi de suite. Un jeu qui a besoin d'un nombre ne lit que le curseur 0.
En quoi le curseur est-il différent du nonce ?
Le nonce compte les rounds et augmente de un à chaque pari sur chaque original. Le curseur compte les tirages dans un round et redémarre à 0 à chaque round. Ensemble avec la paire de seed, ils identifient chaque nombre aléatoire que le site produit jamais.
Combien de nombres aléatoires un round de bingo utilise-t-il ?
Soixante-trois : les curseurs 0 à 24 disposent les 25 cellules de la carte et les curseurs 25 à 62 tirent les 38 boules, tous sans remplacement dans leurs pools.
Frapper au blackjack change-t-il la carte suivante ?
Non. Chaque carte est dérivée de son propre curseur dans l'ordre de distribution, et la liste entière existe une fois que la paire de seed et le nonce sont fixés. Frapper lit l'entrée suivante ; se coucher la laisse non lue.
Tous les jeux utilisent-ils le schéma du curseur ?
Keno et Crash utilisent plutôt des chaînes de hachage : keno hache un hash aléatoire par ticket et un salt dix fois, et crash suit la chaîne bustabit avec une arithmétique entière exacte. Le panneau d'équité vérifie chacun à partir des chaînes qu'il affiche.
SOURCES & RÉFÉRENCES
- Source du moteur Betkyo : _shared/demoLocal.ts (uAt, rollSide, trapAt, kenoDraws), _shared/rng.ts (u64, h52, crash point), et les modules de dérivation pour bingo, hanabi, blackjack, vpoker, holdem, andar, koban, sicbo, roulette, fuku et omikuji
- RFC 2104 — HMAC: Keyed-Hashing for Message Authentication
- Schéma provably fair de Bustabit (la construction du crash point que le moteur reproduit)
LES JEUX DANS CET ARTICLE
Blackjack — règles & jeu gratuit →Bingo — règles & jeu gratuit →Sic Bo — règles & jeu gratuit →