Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

gnodice source realm

Package gnodice est un jeu de dés décentralisé sur gno.land, « prouvablement équitable » (provably fair).

Overview

Package gnodice est un jeu de dés décentralisé sur gno.land, « prouvablement équitable » (provably fair).

Règles du jeu :

  • le joueur choisit un chiffre entre 1 et 6 et mise entre 1 et 10 GNOT ;
  • si le dé tombe sur son chiffre, il reçoit 5 fois sa mise ;
  • chaque joueur ne peut lancer le dé qu'une fois toutes les 10 minutes.

POURQUOI TROIS ÉTAPES (sécurité) : Sur une blockchain, tout est public et une transaction peut contenir plusieurs messages exécutés « tout ou rien ». Si le dé était tiré pendant Play, un tricheur pourrait ajouter un 2e message qui annule toute la transaction quand il perd (ou simuler le tirage avant de miser) : il ne garderait que ses victoires et viderait la banque. On sépare donc le jeu en trois étapes, pour que PERSONNE ne puisse choisir le résultat en connaissant les données de l'autre :

  1. Play : le joueur mise et envoie son chiffre CACHÉ (une empreinte SHA-256 de « chiffre + secret aléatoire + adresse »).
  2. Resolve : le croupier (un service du site) fournit une graine aléatoire de 32 octets SANS connaître le chiffre. Le dé est calculé à partir de la graine et de l'empreinte, et la graine est publiée.
  3. Reveal : on dévoile le chiffre et le secret. Le contrat vérifie l'empreinte et paie si le chiffre est le bon.

Garde-fous : si le croupier ne répond pas, le joueur récupère sa mise (Refund) ; si le chiffre n'est jamais dévoilé, la partie est perdue (Expire). La banque réserve à chaque mise le gain maximal possible : elle ne peut jamais promettre plus qu'elle ne possède.

Constants 2

const Denom, UgnotPerGnot, MinBet, MaxBet, PayoutMultiplier, CooldownSeconds, HistorySize, DieFaces, ResolveTimeout, RevealWindow, DefaultDailyPayoutLimit, DefaultLowBankroll, maxPageSize

 1const (
 2	Denom            = "ugnot"
 3	UgnotPerGnot     = int64(1_000_000)
 4	MinBet           = 1 * UgnotPerGnot  // mise minimale : 1 GNOT
 5	MaxBet           = 10 * UgnotPerGnot // mise maximale : 10 GNOT
 6	PayoutMultiplier = int64(5)          // gain = 5 x la mise
 7	CooldownSeconds  = int64(10 * 60)    // 10 minutes entre deux lancers
 8	HistorySize      = 10                // nombre de parties gardées par joueur
 9	DieFaces         = 6
10
11	// Délais (en secondes, heure des blocs)
12	ResolveTimeout = int64(30 * 60)       // sans tirage au bout de 30 min : le joueur peut être remboursé
13	RevealWindow   = int64(7 * 24 * 3600) // 7 jours pour dévoiler son chiffre après le tirage
14
15	// Limites par défaut (modifiables par le propriétaire avec SetLimits)
16	DefaultDailyPayoutLimit = 500 * UgnotPerGnot // au-delà, le jeu se met en pause tout seul
17	DefaultLowBankroll      = 100 * UgnotPerGnot // en dessous, un événement d'alerte est émis
18
19	maxPageSize = 50 // nombre maximal de parties renvoyées par une lecture
20)
source

Paramètres du jeu. 1 GNOT = 1 000 000 ugnot (la plus petite unité).

Functions 24

func AcceptOwnership

crossing Action
1func AcceptOwnership(cur realm)
source

AcceptOwnership : le propriétaire proposé accepte le contrôle du contrat.

func Commitment

Action
1func Commitment(player address, guess int, salt string) string
source

Commitment calcule l'empreinte d'un chiffre caché. Lecture seule : le site et le croupier peuvent l'appeler pour vérifier leurs calculs.

func Expire

crossing Action
1func Expire(cur realm, id int64)
source

Expire termine une partie dont le chiffre n'a jamais été dévoilé (RevealWindow) : elle compte comme perdue et la réserve est libérée. N'importe qui peut l'appeler.

func Fund

crossing Action
1func Fund(cur realm)
source

Fund alimente la banque. N'importe qui peut l'appeler en envoyant des GNOT.

func GetGameJSON

Action
1func GetGameJSON(id int64) string
source

GetGameJSON renvoie une partie, ou {"error":...} si elle n'existe pas.

func GetInfoJSON

Action
1func GetInfoJSON() string
source

GetInfoJSON renvoie l'état global du jeu et les dernières parties terminées.

func GetOpenGamesJSON

Action
1func GetOpenGamesJSON(after int64) string
source

GetOpenGamesJSON renvoie les parties en cours (en attente de tirage ou de révélation), de la plus ancienne à la plus récente, à partir du numéro `after` exclu (pagination ; 0 pour commencer). Utilisé par le croupier.

func GetPlayerJSON

Action
1func GetPlayerJSON(addr string) string
source

GetPlayerJSON renvoie les statistiques d'un joueur, son temps d'attente, ses parties en cours et ses 10 dernières parties terminées.

func MaxCoverableBet

Action
1func MaxCoverableBet() int64
source

MaxCoverableBet renvoie la plus grosse mise (en ugnot) acceptée en ce moment. Une mise b arrive dans la banque puis réserve 5 x b : il faut donc disponible + b >= 5 x b, soit b <= disponible / 4. Renvoie 0 si le jeu est en pause ou si la limite du jour est atteinte.

func Play

crossing Action
1func Play(cur realm, commitment string) string
source

Play mise sur un chiffre caché. Le joueur envoie sa mise (1 à 10 GNOT) avec la transaction et l'empreinte de son chiffre (voir Commitment). Renvoie le numéro de la partie, par exemple "id=42".

func Refund

crossing Action
1func Refund(cur realm, id int64)
source

Refund rend sa mise au joueur si le croupier n'a pas tiré le dé à temps (ResolveTimeout). N'importe qui peut le déclencher : l'argent va au joueur.

func Render

1func Render(path string) string
source

Render affiche une page lisible sur gnoweb (le site officiel de gno.land).

  • chemin "" : règles, banque et dernières parties
  • chemin "player/<g1...>" : statistiques et historique d'un joueur
  • chemin "game/<numéro>" : une partie, avec de quoi vérifier le tirage

Le chemin est choisi par le visiteur : on ne l'affiche jamais tel quel, on n'utilise qu'une adresse ou un numéro validés.

func Reserved

Action
1func Reserved() int64
source

Reserved renvoie la somme réservée aux parties en cours, en ugnot.

func Resolve

crossing Action
1func Resolve(cur realm, id int64, seed string)
source

Resolve tire le dé d'une partie en attente. Réservé au croupier, qui fournit une graine aléatoire de 32 octets (64 caractères hexadécimaux) sans connaître le chiffre du joueur. La graine est publiée : chacun peut refaire le calcul.

func Reveal

crossing Action
1func Reveal(cur realm, id int64, guess int, salt string) string
source

Reveal dévoile le chiffre caché et termine la partie. N'importe qui peut l'appeler (le joueur ou le service du site) : le gain va toujours au joueur. Renvoie le résultat, par exemple "roll=4;won=true;payout=50000000".

func RollFor

Action
1func RollFor(seed, commitment string, id int64) int
source

RollFor : version publique de rollFromSeed, pour que chacun puisse vérifier un tirage passé (graine et empreinte sont publiques après le tirage).

func SetBlocked

crossing Action
1func SetBlocked(cur realm, addr address, value bool)
source

SetBlocked interdit (true) ou autorise de nouveau (false) une adresse à jouer. Les parties déjà en cours de cette adresse se terminent normalement.

func SetCroupier

crossing Action
1func SetCroupier(cur realm, addr address)
source

SetCroupier désigne l'adresse du service qui tire les dés.

func SetLimits

crossing Action
1func SetLimits(cur realm, dailyLimit, lowBankrollThreshold int64)
source

SetLimits règle le coupe-circuit (gains maximum par jour) et le seuil d'alerte de la banque, en ugnot.

func SetPaused

crossing Action
1func SetPaused(cur realm, value bool)
source

SetPaused met le jeu en pause (true) ou le relance (false). En pause, les nouvelles mises sont refusées mais les parties en cours peuvent se terminer.

func TransferOwnership

crossing Action
1func TransferOwnership(cur realm, newOwner address)
source

TransferOwnership PROPOSE un nouveau propriétaire. Il ne devient propriétaire qu'en appelant AcceptOwnership : une faute de frappe dans l'adresse ne fait donc jamais perdre le contrôle du contrat.

func Withdraw

crossing Action
1func Withdraw(cur realm, amount int64)
source

Withdraw retire des GNOT DISPONIBLES vers le propriétaire. L'argent réservé aux parties en cours ne peut pas être retiré. amount est en ugnot.

Types 2

type Game

struct
 1type Game struct {
 2	ID           int64
 3	Player       address
 4	Commitment   string // empreinte du chiffre caché (64 caractères hexadécimaux)
 5	Bet          int64  // mise en ugnot
 6	Status       Status
 7	Seed         string // graine du croupier, publiée au tirage (vide avant)
 8	Roll         int    // résultat du dé (0 avant le tirage)
 9	Guess        int    // chiffre dévoilé (0 tant qu'il est caché)
10	Payout       int64  // somme versée au joueur (gain, ou mise rendue)
11	PlacedAt     int64  // heure du bloc de la mise (secondes Unix)
12	PlacedHeight int64
13	RolledAt     int64
14	SettledAt    int64
15}
source

Game décrit une partie.

Methods on Game

func Won

method on Game
1func (g *Game) Won() bool
source

Won : true si la partie est gagnée.

type Status

ident
1type Status int
source

Status : étape d'une partie.

Methods on Status

func String

method on Status
1func (s Status) String() string
source

Imports 11

  • chain stdlib
  • chain/banker stdlib
  • chain/runtime stdlib
  • chain/runtime/unsafe stdlib
  • crypto/sha256 stdlib
  • encoding/binary stdlib
  • encoding/hex stdlib
  • gno.land/p/nt/avl/v0 package
  • strconv stdlib
  • strings stdlib
  • time stdlib

Source Files 8