Après un développement important, nous avons rendu le caractère aléatoire sécurisé disponible sur Sui Testnet. Cette fonctionnalité cruciale, alimentée par le module sui::random, ouvre de nouvelles possibilités aux développeurs et constructeurs sur Sui.

Pourquoi avons-nous besoin de caractère aléatoire sur la chaîne ?

Les applications et les projets peuvent utiliser le hasard de différentes manières, depuis la simulation d'un lancer de dés jusqu'à l'attribution de numéros de ticket dans un système garantissant l'équité. Il existe plus de cas d’utilisation du caractère aléatoire en chaîne qu’on pourrait le penser au départ. Voici quelques exemples clés :

1. Jeux de hasard : le cas d'utilisation le plus évident concerne les jeux comme les loteries, les jeux de cartes, les gacha, les loot boxes, les tombolas et les jeux de casino. Le caractère aléatoire natif d’Onchain permet à ces jeux de fonctionner sans obliger les joueurs à faire confiance à l’opérateur du jeu. L'équité du jeu peut être vérifiée par n'importe qui, garantissant ainsi la transparence et la confiance. Ce cas d'utilisation s'étend à des jeux plus complexes, comme déterminer si un personnage d'un RPG touche un ennemi.

2. Échantillonnage aléatoire : sélection d'un sous-ensemble aléatoire à partir d'un groupe plus large, ce qui est utile dans divers domaines tels que la gouvernance et les audits randomisés. Dans le cadre du règlement des différends, un échantillonnage aléatoire peut être utilisé pour sélectionner un jury impartial. Un autre exemple est la sélection aléatoire de comités dans les oracles et les DAO pour les processus de vote et de prise de décision afin d'améliorer l'équité et la transparence.

3. NFT : Le caractère aléatoire permet la création de NFT aléatoires avec différents niveaux de rareté. Par exemple, un objet de collection cryptographique peut avoir diverses caractéristiques attribuées de manière probabiliste. De plus, les NFT pourraient incorporer des traits génétiques ou des mutations aléatoires dans des scénarios de sélection, ouvrant ainsi la porte à la créativité dans la conception et l’utilisation des NFT.

4. Concours et mise en correspondance des joueurs : des exemples intéressants incluent le placement aléatoire des participants dans des tranches de tournoi, la mise en correspondance des joueurs pour les jeux et les interactions sociales, la détermination de l'ordre de jeu dans les jeux au tour par tour, la sélection des gagnants en cas de tirage au sort, l'attribution des joueurs aux équipes et leur ordre dans les brouillons, en attribuant le lieu et les arbitres aux événements.

Andrew Schran de Mysten Labs discute du caractère aléatoire natif de Sui au Sui Basecamp.

Le côté technique du hasard décentralisé

Pour que le caractère aléatoire de la chaîne soit sécurisé, il doit être imprévisible et impartial. L'imprévisibilité garantit que personne ne peut prédire les valeurs aléatoires avant qu'elles ne soient utilisées, empêchant ainsi les attaquants de manipuler les applications en effectuant des transactions en amont ou de ne s'engager que lorsque les résultats sont favorables. L'impartialité garantit qu'aucune partie ne peut influencer le résultat du processus de génération aléatoire, empêchant ainsi les attaquants de fausser les résultats à leur avantage.

Solutions existantes et leurs limites

Diverses solutions existantes visent à fournir un caractère aléatoire sécurisé, chacune avec ses propres compromis. L'utilisation d'une source externe de caractère aléatoire telle qu'une fonction aléatoire vérifiable (VRF) locale/non distribuée est simple mais pas vraiment décentralisée, car faire confiance à quelques nœuds exploitant le VRF peut entraîner des problèmes de prévisibilité et de biais si la source est de connivence avec d'autres parties. Les fonctions de retard vérifiables (VDF) garantissent que le caractère aléatoire ne peut pas être prédit avant un certain temps, mais ont également tendance à être trop lents pour de nombreuses applications. 

D'autres solutions utilisent le caractère aléatoire basé sur Oracle qui peut être prévisible et biaisable si l'oracle est de connivence avec les nœuds et peut être lent à utiliser de manière sécurisée. Par exemple, l’utilisation de drand, une balise aléatoire distribuée, nécessite que le processus attende un cycle aléatoire suffisamment éloigné dans le futur pour garantir qu’il est imprévisible.

L'approche de Sui face au hasard

Mysten Labs a développé une solution qui exploite la cryptographie à seuil et la génération de clés distribuées (DKG) pour présenter les qualités d'imprévisibilité, d'impartialité et de rapidité. Cette solution apparaît sur Sui comme une balise aléatoire prise en charge par le réseau de validation. Au début de chaque époque, les validateurs lancent un protocole DKG pour générer des partages secrets d'une clé distribuée. Ensuite, continuellement au cours de l’époque, ils utilisent leurs parts de clé pour produire un caractère aléatoire à utiliser par les applications. 

Cette solution aléatoire native est beaucoup plus rapide que les solutions existantes sur Sui. La génération aléatoire fonctionne parallèlement au mécanisme de consensus, fournissant des valeurs aléatoires rapidement après qu'une transaction a été ordonnée mais avant son exécution.

De plus, les blocs de déplacement et de transaction programmables (PTB) permettent des compositions puissantes tout en empêchant toute manipulation potentielle grâce aux restrictions intégrées et aux avertissements du compilateur. Bien que d'importants garde-corps de sécurité soient intégrés, les développeurs doivent garantir une conception de programme robuste pour éviter toute inspection par d'autres fonctions Move ou commandes PTB.

Utilisation du module sui::random

Le module sui::random donne accès au pseudo-aléatoire dans Sui, permettant une variété d'applications. Par exemple, les développeurs peuvent utiliser cette fonctionnalité pour implémenter une fonction Move qui sélectionne un gagnant aléatoire pour un tirage au sort. Le code source de cet exemple et d’autres exemples peut être trouvé sur notre référentiel GitHub.

entrée set_winner(jeu : &mut Raffle, rnd : &Random, ctx : &TxContext) { assert!(is_none(game.winner), EWinnerAlreadySet); // le gagnant est de type Option<u32> let gen = new_generator(rnd, ctx); game.winner = Certains(gen.generate_u32_in_range(1, game.num_of_tickets)); // num_of_tickets est u32 qui représente le nombre de participants }

La deuxième ligne de la fonction

set_winner

s'assure qu'un gagnant n'a pas déjà été sélectionné. La fonction initialise ensuite un nouveau générateur aléatoire et un nombre aléatoire est généré dans la plage de numéros de ticket. Le résultat est un gagnant choisi de manière sûre et imprévisible, grâce aux solides garanties de génération aléatoire de Sui, qui garantissent que la valeur renvoyée par generate_u32_in_range est aléatoire et imprévisible tant que moins d'un tiers du pouvoir de vote du réseau est corrompu.

Alors que le caractère aléatoire est généré globalement par le réseau et non par transaction, Sui dérive à chaque fois de ce caractère aléatoire global une famille de fonctions pseudo-aléatoires prédéfinies, imprévisibles et non biaisées. 

nouveau_générateur

est invoqué.

Rassembler le hasard sur Sui

L’introduction d’une source aléatoire sécurisée et évolutive dans Sui constitue une avancée cruciale, permettant aux développeurs de créer des applications plus robustes et sécurisées. Nous encourageons notre communauté à fournir des commentaires et à explorer de nouvelles façons d'utiliser le hasard. Pour des informations techniques plus détaillées, reportez-vous à la documentation Onchain Randomness.

Cette fonctionnalité est désormais disponible sur Sui Testnet. Nous encourageons les développeurs à l'essayer et à garantir que leurs applications sont prêtes à exploiter des valeurs aléatoires sécurisées et robustes lorsque le caractère aléatoire natif est disponible sur le réseau principal. Merci à nos développeurs d'avoir contribué à un écosystème Sui plus sécurisé et plus efficace !