Lancers vérifiables et rejouables
tilttek/diceLancers vérifiables
Un lancer vérifiable permet à un joueur de vérifier que le résultat n'a pas été choisi :
- Le lanceur tire une
Seedd'une source sûre et publie sonCommitment, le SHA-256 du germe. - Le joueur envoie l'expression et un germe de son choix, le germe du client.
- Le lanceur lance avec
FairRoller::roll($pool, $seed, $clientSeed, $nonce)— le nonce numérote les lancers faits avec le même germe — et obtient unVerifiableRoll. - Une fois les lancers de ce germe terminés, le lanceur révèle le germe.
VerifiableRoll::toArray()est ce qu'il publie, l'arrondi des divisions du lancer compris. - Quiconque vérifie avec
FairRoller::verify()que le germe correspond à l'engagement et que relancer, avec le même arrondi, donne le même résultat.
Le lanceur n'a pas pu choisir le résultat : son germe était fixé avant que celui du joueur soit connu. Tout le langage
est couvert : les instructions, les dés des instructions, les groupes, les éléments tirés des listes de textes, les
branches, les répétitions et les phrases sont lancés à partir du même germe, et leurs résultats font partie de ce qui
est publié et comparé. Les dés viennent de Xoshiro256**, dont le germe est le HMAC-SHA256 du germe du client et du
nonce sous le germe.
use Random\Engine\Secure;
use Random\Randomizer;
use Tilttek\Dice\Fairness\FairRoller;
use Tilttek\Dice\Fairness\Seed;
$seed = Seed::generate(new Randomizer(new Secure()));
$commitment = $seed->commitment()->hex; // published now
$roll = new FairRoller()->roll($pool, $seed, 'chosen by the player', 1);
$published = $roll->toArray(); // published with the seed, later
Lancers rejouables
Un lancer rejouable garde un identifiant — 32 chiffres hexadécimaux — et un germe, tous deux tirés d'une source sûre,
et lance à partir du germe. Replayer::replay($id, $pool, $seed, $rounding) le relance, dé pour dé ; l'arrondi, gardé
dans PoolResult::$rounding, est repassé quand il n'est pas celui par défaut. Un journal garde l'identifiant,
l'expression, le germe et le résultat ; tilttek/dice-bundle les garde dans Doctrine.
Les deux reposent sur la stabilité des moteurs à germe de PHP et de Randomizer::getInt(), qui donnent les mêmes
nombres pour le même germe d'une version de PHP à l'autre.