Ce qui est engagé, et quand
Une partie de Mines commence par une seule transaction on-chain (mines_start) qui fait trois choses à la fois, avant que vous choisissiez la moindre case :
- Elle engage la contribution de l’opérateur. Le backend génère un
server_seedaléatoire de 32 octets et la transaction enregistre son hash SHA-256 : l’engagement cryptographique (commit). Le seed lui-même reste secret jusqu’à la fin de la partie. - Elle capture l’entropie de la chaîne. Le programme lit le hash de slot le plus récent dans le sysvar
SlotHashesde Solana et le stocke dans la partie. - Elle fige les conditions. L’avantage de la maison, le plafond de gain et le délai de remboursement sont figés dans votre partie : rien ne peut modifier les conditions d’une grille sur laquelle vous jouez déjà.
Comment la grille de Mines est-elle dérivée ?
Les 25 cases sont indexées de 0 à 24, ligne par ligne sur la grille 5×5 (index = row × 5 + column). La grille est un masque de 25 bits : si le bit t est à 1, la case t cache une mine.
- L’ordre des entrées du hash est exactement : seed, hash de slot, adresse du compte utilisateur, nonce (8 octets little-endian), l’étiquette ASCII
"mines", puis le compteur de blocs (8 octets little-endian, en partant de 0). - Chaque segment de 4 octets est lu en big-endian. Un bloc fournit au plus 8 tirages ; le flux se recharge avec la valeur suivante du compteur si nécessaire.
- La boucle d’échantillonnage par rejet rend chaque tirage parfaitement uniforme : le mélange n’a aucun biais à discuter.
Quelle formule de gain le programme applique-t-il ?
Chaque case sûre retournée multiplie votre montant encaissable par l’inverse exact de vos chances de survie, l’avantage de la maison étant appliqué une seule fois :
Le retour attendu est de
1 − avantage pour toute combinaison de mines et de cases retournées. Les valeurs actuelles sont listées dans Frais et limites.
Ce que le programme vérifie au règlement
La transaction de règlement (mines_settle) révèle le server_seed et déclare un résultat : un encaissement avec un ensemble de cases retournées, ou une explosion sur une case précise. Le programme vérifie alors tout on-chain :
sha256(server_seed)doit être égal à l’engagement stocké au début de la partie ; un autre seed ne peut pas régler la partie.- La grille est redérivée de zéro avec la formule ci-dessus. Toute case déclarée retournée qui est en réalité une mine est rejetée ; une case d’explosion déclarée qui n’est pas une mine est rejetée ; une case d’explosion également déclarée comme retournée est rejetée.
- Le multiplicateur est calculé on-chain à partir de l’avantage figé et du nombre réel de cases retournées, si bien que le gain ne peut pas être faussé.
- L’événement de règlement publie de façon permanente le seed, le hash de slot, le masque complet des mines, vos cases retournées et le résultat.
Ce qui est garanti, et ce qui ne l’est pas
Garanti par le programme :- La grille est fixée avant votre premier choix, par l’engagement et le hash de slot stocké. Les mines ne peuvent pas bouger en cours de partie.
- Au règlement, l’opérateur ne peut pas mentir sur la grille : un mauvais seed, une mine déclarée sûre ou une fausse explosion font échouer la transaction.
- Les conditions de départ (avantage, plafond de gain, délai) s’appliquent jusqu’à la fin de la partie.
- Votre mise ne peut jamais être bloquée : si l’opérateur ne règle jamais la partie, l’annulation peut être déclenchée par n’importe qui une fois le délai de la partie écoulé, ce qui vous rembourse votre mise. En fonctionnement normal, vous n’en arrivez jamais là : une grille abandonnée est encaissée à son multiplicateur actuel avant l’expiration du délai (voir Mines), vous conservez donc vos gains et pas seulement votre mise. L’annulation ouverte à tous est la garantie de fond, pour le cas où l’opérateur aurait disparu.
- L’opérateur connaît la grille pendant que vous jouez. C’est structurel, pas un défaut propre à cette conception : les cases retournées sont servies instantanément off-chain, et celui qui les sert doit savoir où se trouvent les mines. Aucun dispositif d’aléa ne supprime cela : même une grille générée par VRF serait connue de l’opérateur dès qu’il sert votre première case. Ce que l’engagement garantit, c’est que cette connaissance ne peut servir ni à modifier la grille ni à fausser le résultat.
- Moment du démarrage. La grille dépend du hash de slot capturé au démarrage de votre partie, et la transaction de démarrage est soumise par le backend : c’est la même question de timing que pour les autres jeux. Connaître une grille à l’avance n’est utile que si vos choix sont prévisibles ; varier les cases sur lesquelles vous cliquez neutralise toute sélection de grille fondée sur le timing.
- Annulations. L’opérateur peut annuler une partie en cours (y compris, en principe, une partie que vous êtes en train de gagner). Une annulation rembourse l’intégralité de la mise (il n’existe aucun mécanisme de confiscation) et émet toujours un événement public : la fréquence des annulations est donc vérifiable on-chain par n’importe qui.
- Chaque partie doit utiliser un nouveau seed : un seed révélé est public, et le réutiliser rendrait la grille suivante calculable par tous. Le programme rejette on-chain toute réutilisation consécutive, et le backend garantit l’unicité globale.
Comment vérifier une partie de Mines ?
L’événement de règlement (MinesGameSettled) de la dernière transaction de votre partie contient server_seed, slothash, user, nonce, mines_count, mines_mask, revealed_mask, bust_tile, multiplier_bps et is_win. Pour vérifier :
- Contrôlez l’engagement :
sha256(server_seed)doit être égal aucommit_hashpublié dans la transaction de début de votre partie (événementMinesGameStarted), ce qui prouve que la grille était verrouillée avant votre premier choix. - Redérivez le masque des mines avec la formule ci-dessus et comparez-le au
mines_maskde l’événement. - Contrôlez le résultat par rapport au masque : chaque bit de
revealed_maskdoit correspondre à une case sûre, et une case d’explosion doit être une mine. - Contrôlez le multiplicateur avec la formule de gain.