Escrito por: Rede Sui
Sui é uma rede pública L1 redesenhada e construída a partir dos primeiros princípios, com o objetivo de fornecer aos criadores e desenvolvedores uma plataforma de desenvolvimento capaz de hospedar o próximo bilhão de usuários na Web3. Os aplicativos no Sui são baseados na linguagem de contrato inteligente Move e são escalonáveis horizontalmente, permitindo que os desenvolvedores ofereçam suporte a uma ampla gama de desenvolvimento de aplicativos de forma rápida e com baixo custo. A rede principal Sui foi lançada oficialmente em 3 de maio de 2023.
Este artigo servirá como uma referência rápida para desenvolvedores sobre as melhores práticas na Sui Network.
Mova conhecimentos gerais
Leia mais sobre atualizações de pacotes e escreva código amigável para atualização.
Os pacotes são imutáveis e o código do pacote vulnerável pode ser chamado para sempre. A solução é adicionar proteção no nível do objeto. Se você atualizar um pacote de P para P', outros pacotes e clientes que dependem de P continuarão a usar P em vez de atualizarem automaticamente para P'. Portanto, o código que depende do pacote e do cliente deve ser atualizado para apontar explicitamente para P'. Os pacotes que se espera que sejam estendidos por pacotes dependentes podem evitar quebrar suas extensões anteriores a cada atualização, fornecendo uma interface (imutável) que está em conformidade com o padrão em todas as versões. Tomando a ponte de cadeia cruzada Wormhole como exemplo, as mensagens são enviadas através do Wormhole como uma ponte. Para gerar um pacote de extensão para enviar mensagens, você pode usar a instrução prepare_message em qualquer versão do pacote Wormhole para gerar um MessageTicket e o cliente. o código que envia a mensagem deve passar o MessageTicket para subscribe_message no pacote da versão mais recente. As funções públicas não podem ser excluídas ou alteradas, mas as funções públicas (de amigos) podem. Você é livre para usar funções públicas (amigo) ou apenas funções visíveis para si mesmo, a menos que queira tornar a função da biblioteca agora pública para sempre. Você não pode excluir tipos de estrutura, adicionar novos campos (embora possa adicionar campos dinâmicos) ou atualizar novos recursos. Pense bem ao adicionar novos tipos, uma vez adicionados eles permanecerão lá para sempre!
Use coleções suportadas por vetores (como vector, VecSet, VecMap, PriorityQueue), com no máximo 1.000 itens de dados.
Coleções que usam suporte de campo dinâmico (como Table, Bag, ObjectBag, ObjectTable, LinkedTable) são usadas para qualquer coleção que permita que terceiros adicionem coleções maiores e coleções de tamanho desconhecido. Os objetos Sui Move têm um tamanho máximo de 250 KB - qualquer tentativa de criar um objeto maior fará com que a transação seja abortada. Certifique-se de que seu objeto não cresça além da coleção suportada pelo vetor.
Se sua função f exigir um pagamento do chamador, por exemplo, usando SUI, use a função fun f(payment: Coin) em vez da função fun f(payment: &mut Coin, amount: u64). Isso é mais seguro para o chamador porque ele sabe exatamente quanto pagar e não precisa depender da função f para extrair o valor correto.
Não é necessária nenhuma pequena otimização do consumo de gás. Ao calcular o custo do Sui, ele é arredondado para o balde mais próximo, portanto, apenas flutuações muito bruscas causarão mudanças de gás. Principalmente se o seu negócio já estiver na faixa de custo mais baixo, não pode ficar mais barato. Consulte a imagem abaixo para obter detalhes.
Siga as convenções de codificação do Move para obter um estilo consistente.
Composição Use o padrão de exibição para personalizar como seus objetos aparecem em carteiras, aplicativos e navegadores. Evite usar a função "self-transfer" - é possível a qualquer momento retornar obj da função atual em vez de escrever transfer::transfer(obj, tx_context::sender(ctx)), o que permite ao chamador ou ao bloco de transação programável (bloco de transação programável) usa obj. Teste Use sui::test_scenario` para simular um cenário de teste com múltiplas transações e múltiplos remetentes. Use sui::test_utilsmodule para melhores mensagens de correção de erros com testes assert_eq, impressão de depuração com print e destruição somente de teste com destroy . Use sui move test --coverage para calcular informações de cobertura de código durante o teste e use sui move cobertura source --module para visualizar as linhas descobertas destacadas em vermelho. Se possível, recomenda-se definir a cobertura para 100%. Aplicativos Para desempenho ideal e consistência de dados, os aplicativos devem enviar solicitações de gravação e leitura no mesmo nó completo. No TS SDK, isso significa que o aplicativo deve usar a API signTransactionBlock da carteira e, em seguida, enviar a transação chamando execute_transactionBlock no nó completo do aplicativo, em vez de usar a API signAndExecuteTransactionBlock da carteira. Isso garante a consistência da gravação antes da leitura - as leituras do nó completo do aplicativo refletirão imediatamente as gravações da transação, em vez de esperar por um ponto de verificação. Para reduzir a latência, se sua aplicação precisa saber que uma transação foi confirmada, mas não precisa ver imediatamente os efeitos da transação ou ler os objetos/eventos gravados pela transação, use executeTransactionBlock com "showEffects": false e " showEvents": falso. Os aplicativos devem armazenar em cache os dados lidos com frequência localmente, em vez de buscá-los frequentemente no nó completo. Sempre que possível, use blocos de transação programáveis para combinar funcionalidades existentes na cadeia, em vez de lançar um novo código de contrato inteligente. Blocos de transação programáveis permitem processamento em lote em grande escala e composição heterogênea, reduzindo ainda mais as já baixas taxas de gás. Os aplicativos devem deixar o orçamento do gás, o preço do gás e a seleção da moeda para a carteira, o que proporcionará à carteira maior flexibilidade, e é responsabilidade da carteira testar a transação para garantir que a transação não falhe. Assinatura Nunca assine duas transações simultâneas que tocam o mesmo objeto exclusivo, seja usando o objeto exclusivo separadamente ou aguardando a conclusão de uma transação antes de enviar a próxima transação. A violação desta regra pode fazer com que o cliente se equivoque, bloqueando os objetos exclusivos envolvidos em ambas as transações até o final da época atual. Qualquer comando do cliente sui que inicia uma transação (por exemplo, publicação do cliente sui, chamada do cliente sui) pode aceitar o sinalizador --serialize-output para gerar uma transação base64 a ser assinada. Sui oferece suporte a vários esquemas de assinatura para assinatura de transações, incluindo assinaturas múltiplas nativas.
