Po znaczącym rozwoju udostępniliśmy bezpieczną losowość w Sui Testnet. Ta kluczowa funkcja, obsługiwana przez moduł sui::random, otwiera nowe możliwości dla programistów i budowniczych Sui.

Dlaczego potrzebujemy losowości w łańcuchu?

Aplikacje i projekty mogą wykorzystywać losowość na wiele różnych sposobów, od symulacji rzutu kostką po przypisywanie numerów biletów w systemie zapewniającym uczciwość. Istnieje więcej przypadków użycia losowości onchain, niż mogłoby się początkowo wydawać. Oto kilka kluczowych przykładów:

1. Gry losowe: Najbardziej oczywistym przypadkiem użycia są gry takie jak loterie, gry karciane, gacha, skrzynki z łupami, loterie i gry kasynowe. Natywna losowość Onchain pozwala tym grom działać bez konieczności ufania operatorowi gry. Uczciwość gry może sprawdzić każdy, zapewniając przejrzystość i zaufanie. Ten przypadek użycia rozciąga się na bardziej złożone gry, takie jak określanie, czy postać w grze RPG trafia wroga.

2. Próbkowanie losowe: Wybieranie losowego podzbioru z większej grupy, co jest przydatne w różnych dziedzinach, takich jak zarządzanie i audyty losowe. W przypadku rozstrzygania sporów można zastosować próbkowanie losowe w celu wybrania bezstronnego jury. Innym przykładem jest losowy wybór komisji w Oracle i DAO do celów głosowania i podejmowania decyzji w celu zwiększenia uczciwości i przejrzystości.

3. NFT: Losowość umożliwia tworzenie losowych NFT o różnych poziomach rzadkości. Na przykład kryptograficzny przedmiot kolekcjonerski może mieć przypisane probabilistycznie różne cechy. Ponadto NFT mogą uwzględniać cechy genetyczne lub przypadkowe mutacje w scenariuszach hodowlanych, otwierając drzwi dla kreatywności w projektowaniu i stosowaniu NFT.

4. Konkursy i dopasowywanie graczy: Interesujące przykłady obejmują losowe umieszczanie uczestników w drabinkach turniejowych, dopasowywanie graczy do gier i interakcji społecznych, ustalanie kolejności gry w grach turowych, wybieranie zwycięzców w przypadku remisu, przydzielanie graczy do drużyn i ich kolejność w draftach, przydzielanie miejsc i sędziów na wydarzeniach.

Andrew Schran z Mysten Labs omawia wrodzoną losowość Sui w Sui Basecamp.

Techniczna strona zdecentralizowanej losowości

Aby losowość onchain była bezpieczna, musi być nieprzewidywalna i bezstronna. Nieprzewidywalność sprawia, że ​​nikt nie jest w stanie przewidzieć losowych wartości przed ich użyciem, co uniemożliwia atakującym manipulowanie aplikacjami poprzez transakcje wyprzedzające lub angażowanie się tylko wtedy, gdy wyniki są korzystne. Bezstronność gwarantuje, że żadna pojedyncza strona nie będzie mogła wpłynąć na wynik procesu generowania losowości, uniemożliwiając atakującym wypaczenie wyników na swoją korzyść.

Istniejące rozwiązania i ich ograniczenia

Różne istniejące rozwiązania mają na celu zapewnienie bezpiecznej losowości, każde z własnymi kompromisami. Korzystanie z zewnętrznego źródła losowości, takiego jak lokalna/nierozproszona weryfikowalna funkcja losowa (VRF), jest proste, ale nie do końca zdecentralizowane, ponieważ zaufanie do kilku węzłów obsługujących VRF może prowadzić do problemów z przewidywalnością i stronniczością, jeśli źródło jest w zmowie z innymi stronami. Weryfikowalne funkcje opóźnienia (VDF) zapewniają, że losowości nie można przewidzieć przed upłynięciem określonego czasu, ale w przypadku wielu aplikacji często działają zbyt wolno. 

Inne rozwiązania wykorzystują losowość opartą na wyroczni, która może być przewidywalna i stronnicza, jeśli wyrocznia współpracuje z węzłami, a korzystanie z niej w bezpieczny sposób może być powolne. Na przykład użycie dranda, rozproszonego sygnalizatora losowości, wymaga od procesu oczekiwania na rundę losowości, która jest wystarczająco odległa w przyszłości, aby zapewnić jej nieprzewidywalność.

Podejście Sui do losowości

Mysten Labs opracowało rozwiązanie, które wykorzystuje kryptografię progową i rozproszone generowanie klucza (DKG), aby wykazać się nieprzewidywalnością, bezstronnością i szybkością. To rozwiązanie pojawia się na Sui jako sygnalizator losowości obsługiwany przez sieć walidatorów. Na początku każdej epoki walidatory inicjują protokół DKG w celu wygenerowania tajnych udziałów rozproszonego klucza. Następnie, w sposób ciągły przez całą epokę, wykorzystują swoje udziały w kluczu, aby zapewnić losowość korzystania z aplikacji. 

To natywne rozwiązanie losowości jest znacznie szybsze niż istniejące rozwiązania w Sui. Generowanie losowości działa równolegle do mechanizmu konsensusu, dostarczając losowe wartości szybko po zleceniu transakcji, ale przed jej realizacją.

Dodatkowo funkcje Move i Programmable Transaction Blocks (PTB) umożliwiają tworzenie potężnych kompozycji, jednocześnie zapobiegając potencjalnym manipulacjom dzięki wbudowanym ograniczeniom i ostrzeżeniom kompilatora. Chociaż wbudowane są ważne szyny bezpieczeństwa, programiści powinni zadbać o solidne projekty programów, aby uniknąć inspekcji przez inne funkcje Move lub polecenia PTB.

Korzystanie z modułu sui::random

Moduł sui::random zapewnia dostęp do pseudolosowości w Sui, umożliwiając różnorodne aplikacje. Na przykład programiści mogą użyć tej funkcji do zaimplementowania funkcji Move, która wybiera losowego zwycięzcę loterii. Kod źródłowy tego i innych przykładów można znaleźć w naszym repozytorium GitHub.

wpis set_winner(game: &mut Raffle, rnd: &Random, ctx: &TxContext) { Assert!(is_none(game.winner), EWinnerAlreadySet); // zwycięzca jest typu Option<u32> let gen = new_generator(rnd, ctx); game.winner = Some(gen.generate_u32_in_range(1, game.num_of_tickets)); // num_of_tickets to u32, które reprezentuje liczbę uczestników }

Druga linia funkcji

zwycięzca seta

gwarantuje, że zwycięzca nie został jeszcze wybrany. Następnie funkcja inicjuje nowy generator losowy i generowana jest liczba losowa w zakresie numerów biletów. Rezultatem jest bezpiecznie i nieprzewidywalnie wybrany zwycięzca, dzięki solidnym gwarancjom losowego generowania wyników Sui, które zapewniają, że wartość zwracana przez generate_u32_in_range jest losowa i nieprzewidywalna, o ile mniej niż jedna trzecia siły głosu w sieci jest uszkodzona.

Chociaż losowość jest generowana globalnie przez sieć, a nie przez transakcję, Sui za każdym razem wyprowadza z tej globalnej losowości nieprzewidywalną i obiektywną rodzinę funkcji pseudolosowych. 

nowy_generator

jest wywoływany.

Zaokrąglanie losowości na Sui

Wprowadzenie bezpiecznego i skalowalnego źródła losowości do Sui to kluczowy postęp, umożliwiający programistom tworzenie solidniejszych i bezpieczniejszych aplikacji. Zachęcamy naszą społeczność do przekazywania opinii i odkrywania nowych sposobów wykorzystania losowości. Bardziej szczegółowe informacje techniczne można znaleźć w dokumentacji Onchain Randomness.

Ta funkcja jest teraz dostępna w Sui Testnet. Zachęcamy programistów do wypróbowania tego i upewnienia się, że ich aplikacje są gotowe do wykorzystania bezpiecznych i niezawodnych wartości losowych, gdy natywna losowość jest dostępna w sieci głównej. Dziękujemy naszym programistom za wkład w bezpieczniejszy i wydajniejszy ekosystem Sui!