Wiki ZooBC
Applis et développement sur ZooBC

Les applis multijoueurs

Les jeux de plateau et les jeux de dés de ZooBC se jouent de deux à quatre personnes, et chaque coup est une transaction que chaque nœud vérifie par rapport aux mêmes règles. Les mises forment une cagnotte, que le protocole verse à la fin de la partie, moins une commission de 1 % pour le pool des apps, sauf si la partie se termine par un nul.

Ouvrir et rejoindre une partie

Un joueur ouvre une partie avec CreateApp, en choisissant le type et 2 à 4 sièges (la bataille navale en a toujours exactement 2), et paie la première mise. La partie est alors ouverte (Open). Chaque JoinApp paie une mise égale, et quand le dernier siège est occupé, la partie devient active (Active). Un adversaire désigné, facultatif, transforme la partie en défi direct que seul ce compte peut rejoindre.

Un siège exige un compte de 36 octets, comme un compte ZooBC natif. Les comptes dont l’adresse fait 24 octets, c’est-à-dire les types Ethereum et hachage Bitcoin, ne peuvent pas occuper de siège, même si le message d’erreur indique «  multiplayer apps require a ZBC account  » (types de clés). Les paris en solo acceptent n’importe quel compte.

Qui joue en premier

Qui commence peut avoir son importance ; personne ne peut donc le savoir ni l’orienter à l’avance. Quand le dernier siège est occupé, le tour est en attente : personne n’a le chrono qui tourne, et tout coup est sans effet. Deux blocs plus tard, le résolveur tire le siège d’ouverture, sous la forme d’un hachage de la graine de ce bloc et de l’identifiant de l’appli, pris modulo le nombre de sièges. Le producteur du bloc qui contient la dernière adhésion connaît sa propre graine, mais pas celle du bloc situé deux blocs plus loin ; il ne peut donc pas inclure ou écarter l’adhésion selon qui commencerait. Ni le créateur ni le dernier arrivant ne commence par règle. La bataille navale fait exception : celui qui rejoint joue en premier, en engageant son plateau.

Dans les quatre jeux de dés (ludo, pig, course et monopoly-lite), un coup n’est pas appliqué dans le bloc qui l’inclut. Il est stocké en attente et appliqué par le bloc suivant, avec la graine de ce bloc et indexé par l’identifiant de transaction du coup, de sorte que le producteur qui a inclus le coup ne voit jamais le lancer. Un seul coup en attente est autorisé à la fois, et un coup devenu illégal entre-temps est abandonné.

L’horloge de coup

Quand le dernier siège rejoint la partie, et de nouveau après chaque coup accepté, l’échéance est fixée 240 blocs plus loin, soit environ une heure. Le joueur dont c’est le tour doit jouer avant, ou envoyer un AppMove avec un coup vide : un keep-alive payant qui repousse l’échéance de 240 blocs supplémentaires. Un coup venant d’un joueur dont le chrono ne tourne pas, ou un coup illégal, est refusé à l’envoi ; s’il atteint malgré tout un bloc, c’est une opération nulle, sans frais.

L’horloge de coup : 240 blocs après le dernier coup, un joueur en attente peut réclamer la cagnotte moins la commission de 1 %.
L’horloge de coup : 240 blocs après le dernier coup, un joueur en attente peut réclamer la cagnotte moins la commission de 1 %.

Comment une partie se termine

FinCommentGain
Victoireun coup fait gagner la partiela cagnotte moins la commission de 1 %, au gagnant
Nulun coup termine la partie sur un nulchaque siège récupère sa mise ; pas de commission
Abandonun joueur envoie ResignAppla cagnotte moins la commission, partagée à parts égales entre les autres sièges, l’éventuel reste allant au premier d’entre eux
Délai dépasséun joueur assis dont le chrono ne tourne pas envoie ClaimAppTimeout, à partir de l’échéance + 1la cagnotte moins la commission, partagée entre tous les sièges sauf celui dont le chrono tourne

La commission vaut floor(cagnotte × 100 ÷ 10 000), soit 1 % de la cagnotte : deux joueurs qui misent 1 ZBC chacun forment une cagnotte de 2 ZBC, et le gagnant reçoit 1,98 ZBC dans le bloc du coup gagnant. Le producteur du bloc ne prend rien sur la cagnotte. Rien ne se termine tout seul : après une échéance manquée, la partie attend qu’un joueur choisisse d’envoyer la réclamation, et personne, pas même la ZooBC Foundation, ne peut annuler une partie.

Les moteurs

Le moteur de chaque jeu fait partie du nœud, avec quelques simplifications bonnes à connaître :

  • les échecs n’ont ni roque ni prise en passant, et les pions sont toujours promus en dame ;
  • aux dames, la prise est obligatoire et les sauts multiples s’enchaînent ;
  • au reversi, un siège qui n’a aucun coup légal passe son tour ;
  • à la pipopipette, compléter une case donne un coup supplémentaire ;
  • le pig se gagne à 100, et la course, le jeu de serpents et échelles, se termine à 49 ;
  • au ludo, chaque siège déplace quatre pions ;
  • au monopoly-lite, chaque siège commence avec 1 500 et reçoit 200 en passant par la case Départ.

La bataille navale : des secrets sur une chaîne publique

La bataille navale a besoin d’informations cachées sur une chaîne où tout est public, et elle les obtient par engagement et révélation. Avant de jouer, chaque joueur choisit un sel secret de 32 octets pour chacune des 100 cases d’un plateau de 10 × 10 et publie SHA3-256(is_ship ‖ sel) pour chaque case : 100 hachages, soit 3 200 octets en tout. Le créateur envoie son engagement avec CreateApp, et celui qui rejoint envoie le sien comme premier coup. Comme chaque sel est aléatoire, les hachages ne révèlent rien.

Un joueur tire avec le coup [0, cell]. Le propriétaire de ce plateau doit révéler la case visée avec [1, is_ship, salt], et chaque nœud vérifie que ces valeurs redonnent le hachage engagé. Un mensonge produit un hachage différent et il est refusé : le propriétaire ne peut que dire la vérité, ou laisser le temps s’écouler et perdre face à un ClaimAppTimeout. Le premier joueur à toucher 17 cases de navire gagne. S’engager sur moins de cases de navire n’apporte rien : une fois que le tireur a tiré ses 100 coups et que moins de 17 cases de navire ont été révélées, le tireur gagne.

La bataille navale par engagement et révélation : des hachages sur la chaîne, un tir, et une révélation que chaque nœud vérifie.
La bataille navale par engagement et révélation : des hachages sur la chaîne, un tir, et une révélation que chaque nœud vérifie.

Voir aussi