Dopo uno sviluppo significativo, abbiamo reso disponibile la casualità sicura su Sui Testnet. Questa funzionalità cruciale, alimentata dal modulo sui::random, apre nuove possibilità per sviluppatori e costruttori su Sui.

Perché abbiamo bisogno della casualità sulla catena?

App e progetti possono utilizzare la casualità in un'ampia gamma di modi diversi, dalla simulazione di un lancio di dadi all'assegnazione di numeri di biglietti in un sistema che garantisce l'equità. Esistono più casi d’uso per la casualità onchain di quanto si possa pensare inizialmente. Ecco alcuni esempi chiave:

1. Giochi d'azzardo: il caso d'uso più ovvio è per giochi come lotterie, giochi di carte, gacha, loot box, lotterie e giochi da casinò. La casualità nativa di Onchain consente a questi giochi di funzionare senza richiedere ai giocatori di fidarsi dell'operatore del gioco. La correttezza del gioco può essere verificata da chiunque, garantendo trasparenza e fiducia. Questo caso d'uso si estende a giochi più complessi, come determinare se un personaggio in un gioco di ruolo mette a segno un colpo su un nemico.

2. Campionamento casuale: selezione di un sottoinsieme casuale da un gruppo più ampio, utile in vari ambiti come la governance e gli audit randomizzati. Nella risoluzione delle controversie, il campionamento casuale può essere utilizzato per selezionare una giuria imparziale. Un altro esempio è la selezione casuale dei comitati negli oracoli e nelle DAO per i processi di voto e decisionali per migliorare l’equità e la trasparenza.

3. NFT: la casualità consente la creazione di NFT casuali con diversi livelli di rarità. Ad esempio, un oggetto da collezione crittografico potrebbe avere vari tratti assegnati in modo probabilistico. Inoltre, gli NFT potrebbero incorporare tratti genetici o mutazioni casuali negli scenari di allevamento, aprendo le porte alla creatività nella progettazione e nell’uso degli NFT.

4. Concorsi e abbinamento dei giocatori: esempi interessanti includono il posizionamento casuale dei partecipanti nei gironi dei tornei, l'abbinamento dei giocatori per i giochi e le interazioni sociali, la determinazione dell'ordine di gioco nei giochi a turni, la scelta dei vincitori in caso di pareggio, l'assegnazione dei giocatori alle squadre e il loro ordine nelle bozze, l'assegnazione della sede e gli arbitri sugli eventi.

Andrew Schran di Mysten Labs parla della casualità nativa di Sui al Sui Basecamp.

Il lato tecnico della casualità decentralizzata

Affinché la casualità onchain sia sicura, deve essere imprevedibile e imparziale. L’imprevedibilità garantisce che nessuno possa prevedere i valori casuali prima che vengano utilizzati, impedendo agli aggressori di manipolare le app effettuando transazioni anticipate o di impegnarsi solo quando i risultati sono favorevoli. L’imparzialità garantisce che nessuna singola parte possa influenzare l’esito del processo di generazione della casualità, impedendo agli aggressori di distorcere i risultati a proprio vantaggio.

Soluzioni esistenti e loro limiti

Varie soluzioni esistenti mirano a fornire una casualità sicura, ciascuna con i propri compromessi. Usare una fonte esterna di casualità come una funzione casuale verificabile (VRF) locale/non distribuita è semplice ma non veramente decentralizzato, poiché fidarsi di alcuni nodi che gestiscono la VRF può portare a problemi di prevedibilità e parzialità se la fonte è collusa con altre parti. Le funzioni di ritardo verificabili (VDF) garantiscono che la casualità non possa essere prevista fino a quando non è trascorso un certo tempo, ma tendono anche ad essere troppo lente per molte app. 

Altre soluzioni utilizzano la casualità basata sull'oracolo che potrebbe essere prevedibile e influenzabile se l'oracolo collude con i nodi e può essere lento da utilizzare in modo sicuro. Ad esempio, l'utilizzo di drand, un faro di casualità distribuita, richiede che il processo attenda un round di casualità sufficientemente lontano nel futuro da garantire che sia imprevedibile.

L'approccio di Sui alla casualità

Mysten Labs ha sviluppato una soluzione che sfrutta la crittografia a soglia e la generazione di chiavi distribuite (DKG) per mostrare le qualità di essere imprevedibile, imparziale e veloce. Questa soluzione appare su Sui come un faro di casualità supportato dalla rete di validatori. All'inizio di ogni epoca, i validatori avviano un protocollo DKG per generare condivisioni segrete di una chiave distribuita. Quindi, continuamente durante l'epoca, usano le loro condivisioni della chiave per produrre casualità da utilizzare per le app. 

Questa soluzione di casualità nativa è molto più veloce delle soluzioni esistenti su Sui. La generazione della casualità opera parallelamente al meccanismo di consenso, fornendo valori casuali rapidamente dopo che una transazione è stata ordinata ma prima dell'esecuzione.

Inoltre, i blocchi di transazione programmabili e di spostamento (PTB) consentono composizioni potenti prevenendo al contempo potenziali manipolazioni tramite restrizioni integrate e avvisi del compilatore. Sebbene siano presenti importanti barriere di sicurezza integrate, gli sviluppatori dovrebbero garantire una progettazione solida dei programmi per evitare l'ispezione da parte di altre funzioni di spostamento o comandi PTB.

Utilizzando il modulo sui::random

Il modulo sui::random fornisce l'accesso alla pseudo-casualità all'interno di Sui, abilitando una varietà di app. Ad esempio, gli sviluppatori possono utilizzare questa funzionalità per implementare una funzione Sposta che seleziona un vincitore casuale per una lotteria. Il codice sorgente di questo e di altri esempi può essere trovato nel nostro repository GitHub.

entry set_winner(game: &mut Raffle, rnd: &Random, ctx: &TxContext) { assert!(is_none(game.winner), EWinnerAlreadySet); // il vincitore è di tipo Option<u32> let gen = new_generator(rnd, ctx); game.winner = Some(gen.generate_u32_in_range(1, game.num_of_tickets)); // num_of_tickets è u32 che rappresenta il numero di partecipanti }

La seconda riga della funzione

set_vincitore

garantisce che non sia già stato selezionato un vincitore. La funzione inizializza quindi un nuovo generatore casuale e viene generato un numero casuale all'interno dell'intervallo dei numeri dei biglietti. Il risultato è un vincitore scelto in modo sicuro e imprevedibile, grazie alle solide garanzie di generazione casuale di Sui, che assicurano che il valore restituito da generate_u32_in_range sia casuale e imprevedibile fintanto che meno di un terzo del potere di voto della rete è corrotto.

Mentre la casualità è generata globalmente dalla rete e non per transazione, Sui deriva da quella casualità globale una famiglia di funzioni pseudocasuali seminate ogni volta, imprevedibili e imparziali. 

nuovo_generatore

viene invocato.

Arrotondando la casualità su Sui

L’introduzione di una fonte di casualità sicura e scalabile in Sui è un progresso cruciale, che consente agli sviluppatori di creare app più robuste e sicure. Incoraggiamo la nostra community a fornire feedback ed esplorare nuovi modi per utilizzare la casualità. Per informazioni tecniche più dettagliate, fare riferimento alla documentazione Onchain Randomness.

Questa funzionalità è ora disponibile su Sui Testnet. Incoraggiamo gli sviluppatori a provarlo e a garantire che le loro app siano pronte per sfruttare valori casuali sicuri e robusti quando la casualità nativa è disponibile su Mainnet. Grazie ai nostri sviluppatori per aver contribuito a un ecosistema Sui più sicuro ed efficiente!