Após um desenvolvimento significativo, disponibilizamos a aleatoriedade segura no Sui Testnet. Este recurso crucial, alimentado pelo módulo sui::random, abre novas possibilidades para desenvolvedores e construtores no Sui.

Por que precisamos de aleatoriedade na cadeia?

Aplicativos e projetos podem usar a aleatoriedade de diversas maneiras, desde a simulação de um lançamento de dados até a atribuição de números de ingressos em um sistema que garante imparcialidade. Existem mais casos de uso para aleatoriedade onchain do que se poderia imaginar inicialmente. Aqui estão alguns exemplos importantes:

1. Jogos de azar: O caso de uso mais óbvio é para jogos como loterias, jogos de cartas, gacha, caixas de saque, rifas e jogos de cassino. A aleatoriedade nativa Onchain permite que esses jogos funcionem sem exigir que os jogadores confiem no operador do jogo. A imparcialidade do jogo pode ser verificada por qualquer pessoa, garantindo transparência e confiança. Esse caso de uso se estende a jogos mais complexos, como determinar se um personagem em um RPG acerta um inimigo.

2. Amostragem aleatória: Selecção de um subconjunto aleatório de um grupo maior, o que é útil em vários domínios, tais como governação e auditorias aleatórias. Na resolução de disputas, a amostragem aleatória pode ser usada para selecionar um júri imparcial. Outro exemplo é a seleção aleatória de comitês em oráculos e DAOs para processos de votação e tomada de decisão para aumentar a justiça e a transparência.

3. NFTs: A aleatoriedade permite a criação de NFTs aleatórios com diferentes níveis de raridade. Por exemplo, um criptocolecionável pode ter várias características atribuídas probabilisticamente. Além disso, os NFTs poderiam incorporar características genéticas ou mutações aleatórias em cenários de reprodução, abrindo portas para a criatividade no design e uso de NFTs.

4. Concursos e correspondência de jogadores: Exemplos interessantes incluem a colocação aleatória de participantes em chaves de torneio, correspondência de jogadores para jogos e interações sociais, determinação da ordem de jogo em jogos baseados em turnos, escolha de vencedores em caso de empate, alocação de jogadores em equipes e sua ordem nos draft, designando local e árbitros nos eventos.

Andrew Schran, do Mysten Labs, discutindo a aleatoriedade nativa de Sui no Sui Basecamp.

O lado técnico da aleatoriedade descentralizada

Para que a aleatoriedade onchain seja segura, ela deve ser imprevisível e imparcial. A imprevisibilidade garante que ninguém possa prever os valores aleatórios antes de serem usados, evitando que invasores manipulem aplicativos por meio de transações antecipadas ou apenas se envolvam quando os resultados forem favoráveis. A imparcialidade garante que nenhuma parte possa influenciar o resultado do processo de geração de aleatoriedade, evitando que os invasores distorçam os resultados em seu benefício.

Soluções existentes e suas limitações

Várias soluções existentes visam fornecer aleatoriedade segura, cada uma com suas próprias vantagens e desvantagens. Usar uma fonte externa de aleatoriedade, como uma Função Aleatória Verificável (VRF) local/não distribuída, é simples, mas não verdadeiramente descentralizada, pois confiar em alguns nós que operam o VRF pode levar a problemas de previsibilidade e preconceito se a fonte conspirar com outras partes. Funções de atraso verificáveis ​​(VDFs) garantem que a aleatoriedade não possa ser prevista até que um determinado tempo tenha passado, mas também tendem a ser muito lentas para muitos aplicativos. 

Outras soluções usam aleatoriedade baseada em oráculo que pode ser previsível e tendenciosa se o oráculo conspirar com nós e pode ser lento para usar de maneira segura. Por exemplo, a utilização do drand, um farol de aleatoriedade distribuído, exige que o processo espere por uma rodada de aleatoriedade que esteja suficientemente distante no futuro para garantir que seja imprevisível.

A abordagem de Sui à aleatoriedade

Mysten Labs desenvolveu uma solução que aproveita a criptografia de limite e a geração distribuída de chaves (DKG) para exibir as qualidades de ser imprevisível, imparcial e rápido. Esta solução aparece no Sui como um farol de aleatoriedade suportado pela rede validadora. No início de cada época, os validadores iniciam um protocolo DKG para gerar compartilhamentos secretos de uma chave distribuída. Então, continuamente durante a época, eles usam seus compartilhamentos de chave para produzir aleatoriedade para uso dos aplicativos. 

Esta solução nativa de aleatoriedade é muito mais rápida do que as soluções existentes no Sui. A geração de aleatoriedade opera paralelamente ao mecanismo de consenso, fornecendo valores aleatórios rapidamente após uma transação ter sido ordenada, mas antes da execução.

Além disso, Move e Blocos de Transação Programáveis ​​(PTBs) permitem composições poderosas, evitando possíveis manipulações por meio de restrições integradas e avisos do compilador. Embora existam importantes barreiras de segurança integradas, os desenvolvedores devem garantir designs de programas robustos para evitar a inspeção por outras funções Move ou comandos PTB.

Usando o módulo sui::random

O módulo sui::random fornece acesso à pseudo-aleatoriedade dentro do Sui, permitindo uma variedade de aplicativos. Por exemplo, os desenvolvedores podem usar esse recurso para implementar uma função Mover que seleciona um vencedor aleatório para um sorteio. O código fonte deste e de outros exemplos pode ser encontrado em nosso repositório GitHub.

entrada set_winner (jogo: &mut Sorteio, rnd: &Random, ctx: &TxContext) { assert!(is_none(game.winner), EWinnerAlreadySet); // o vencedor é do tipo Option<u32> let gen = new_generator(rnd, ctx); game.winner = Alguns(gen.generate_u32_in_range(1, game.num_of_tickets)); // num_of_tickets é u32 que representa o número de participantes }

A segunda linha da função

set_winner

garante que um vencedor ainda não tenha sido selecionado. A função então inicializa um novo gerador aleatório e um número aleatório é gerado dentro do intervalo de números de tickets. O resultado é um vencedor escolhido de forma segura e imprevisível, graças às robustas garantias de geração aleatória de Sui, que garantem que o valor retornado por generate_u32_in_range seja aleatório e imprevisível, desde que menos de um terço do poder de voto da rede esteja corrompido.

Embora a aleatoriedade seja gerada globalmente pela rede e não por transação, Sui deriva dessa aleatoriedade global uma família de funções pseudoaleatórias semeadas imprevisíveis e imparciais todas as vezes 

novo_gerador

é invocado.

Arredondando a aleatoriedade em Sui

A introdução de uma fonte segura e escalonável de aleatoriedade no Sui é um avanço crucial, permitindo que os desenvolvedores criem aplicativos mais robustos e seguros. Incentivamos nossa comunidade a fornecer feedback e explorar novas maneiras de usar a aleatoriedade. Para informações técnicas mais detalhadas, consulte a documentação Onchain Randomness.

Este recurso agora está disponível no Sui Testnet. Incentivamos os desenvolvedores a experimentá-lo e garantir que seus aplicativos estejam prontos para aproveitar valores aleatórios seguros e robustos quando a aleatoriedade nativa estiver disponível na Mainnet. Obrigado aos nossos desenvolvedores por contribuir para um ecossistema Sui mais seguro e eficiente!