Escrito por: Red Sui

Sui es una cadena pública L1 rediseñada y construida a partir de los primeros principios, con el objetivo de proporcionar a los creadores y desarrolladores una plataforma de desarrollo capaz de albergar a los próximos mil millones de usuarios en Web3. Las aplicaciones en Sui se basan en el lenguaje de contrato inteligente Move y son escalables horizontalmente, lo que permite a los desarrolladores respaldar una amplia gama de desarrollo de aplicaciones de manera rápida y a bajo costo. La red principal de Sui se lanzó oficialmente el 3 de mayo de 2023.

Este artículo servirá como referencia rápida para los desarrolladores sobre las mejores prácticas en Sui Network.

Mover conocimientos generales

Lea más sobre las actualizaciones de paquetes y escriba código compatible con las actualizaciones.

Los paquetes son inmutables y el código de paquete vulnerable se puede llamar para siempre. La solución es agregar protección a nivel de objeto. Si actualiza un paquete de P a P', otros paquetes y clientes que dependen de P seguirán usando P en lugar de actualizarse automáticamente a P'. Por lo tanto, el código que depende tanto del paquete como del cliente debe actualizarse para que apunte explícitamente a P'. Los paquetes que se espera que sean ampliados por paquetes dependientes pueden evitar romper sus extensiones anteriores con cada actualización al proporcionar una interfaz (inmutable) que se ajusta al estándar en todas las versiones. Tomando el puente entre cadenas de Wormhole como ejemplo, los mensajes se envían a través de Wormhole como puente. Para generar un paquete de extensión para enviar mensajes, puede usar la instrucción prepare_message en cualquier versión del paquete Wormhole para generar un MessageTicket y el cliente. El código que envía el mensaje debe pasar MessageTicket a Publish_message en el paquete de la última versión. Las funciones públicas no se pueden eliminar ni cambiar, pero las funciones públicas (amigas) sí. Eres libre de usar funciones públicas (amigas) o solo visibles para ti, a menos que quieras que la función de biblioteca ahora sea pública para siempre. No puede eliminar tipos de estructuras, agregar nuevos campos (aunque puede agregar campos dinámicos) ni actualizar nuevas funciones. Piense detenidamente al agregar nuevos tipos, una vez agregados, ¡están ahí para siempre!

Utilice colecciones compatibles con vectores (como vector, VecSet, VecMap, PriorityQueue), con un máximo de 1000 elementos de datos.

Las colecciones que utilizan soporte de campos dinámicos (como Table, Bag, ObjectBag, ObjectTable, LinkedTable) se utilizan para cualquier colección que permita a terceros agregar colecciones más grandes y colecciones de tamaño desconocido. Los objetos Sui Move tienen un tamaño máximo de 250 KB; cualquier intento de crear un objeto más grande provocará que la transacción se cancele; asegúrese de que su objeto no crezca más que la colección admitida del vector.

Si su función f requiere un pago de la persona que llama, por ejemplo usando SUI, use la función fun f(paid: Coin) en lugar de la función fun f(paid: &mut Coin, cantidad: u64). Esto es más seguro para la persona que llama porque sabe exactamente el monto exacto del pago y no necesita depender de la función f para extraer el monto correcto.

No se requiere una pequeña optimización del consumo de gas. Al calcular el costo de Sui, se redondea al cubo más cercano, por lo que solo las fluctuaciones muy pronunciadas provocarán cambios de gas. Especialmente si su oferta ya se encuentra en el rango de costo más bajo, no puede ser más barata. Consulte la imagen a continuación para obtener más detalles.

Siga las convenciones de codificación de Move para lograr un estilo coherente.

Componibilidad Utilice el estándar de visualización para personalizar cómo aparecen sus objetos en billeteras, aplicaciones y navegadores. Evite el uso de la función "autotransferencia": es posible en cualquier momento devolver obj desde la función actual en lugar de escribir transfer::transfer(obj, tx_context::sender(ctx)), lo que permite que la persona que llama o bloquee la transacción programable (bloque de transacción programable) usa obj. Prueba Utilice sui::test_scenario` para simular un escenario de prueba con múltiples transacciones y múltiples remitentes. Utilice sui::test_utilsmodule para obtener mejores mensajes de corrección de errores con pruebas de afirmar_eq, impresión de depuración con print y destrucción de solo prueba con destroy. Utilice sui move test --coverage para calcular la información de cobertura del código durante la prueba y utilice sui move coverture source --module para ver las líneas descubiertas resaltadas en rojo. Si es posible, se recomienda establecer la cobertura al 100%. Aplicaciones Para lograr un rendimiento óptimo y coherencia de los datos, las aplicaciones deben enviar solicitudes de escritura y lectura en el mismo nodo completo. En TS SDK, esto significa que la aplicación debe usar la API signTransactionBlock de la billetera y luego enviar la transacción llamando a enable_transactionBlock en el nodo completo de la aplicación, en lugar de usar la API signAndExecuteTransactionBlock de la billetera. Esto garantiza la coherencia de escritura antes de lectura: las lecturas desde el nodo completo de la aplicación reflejarán inmediatamente las escrituras de la transacción, en lugar de esperar un punto de control. Para reducir la latencia, si su aplicación necesita saber que una transacción ha sido confirmada, pero no necesita ver inmediatamente los efectos de la transacción o leer los objetos/eventos escritos por la transacción, use ejecutarTransactionBlock con "showEffects": false y " mostrarEventos": falso. Las aplicaciones deben almacenar en caché los datos leídos con frecuencia localmente en lugar de recuperarlos con frecuencia del nodo completo. Siempre que sea posible, utilice bloques de transacciones programables para combinar la funcionalidad en cadena existente en lugar de publicar un nuevo código de contrato inteligente. Los bloques de transacciones programables permiten el procesamiento de lotes a gran escala y una composición heterogénea, lo que reduce aún más las ya bajas tarifas del gas. Las aplicaciones deben dejar el presupuesto de gas, el precio del gas y la selección de monedas en manos de la billetera, lo que le brindará mayor flexibilidad, y es responsabilidad de la billetera probar la transacción para garantizar que no falle. Firma Nunca firme dos transacciones simultáneas que toquen el mismo objeto exclusivo, ya sea usando el objeto exclusivo por separado o esperando a que se complete una transacción antes de enviar la siguiente. La violación de esta regla puede hacer que el cliente se equivoque, bloqueando los objetos exclusivos involucrados en ambas transacciones hasta el final de la época actual. Cualquier comando del cliente sui que inicie una transacción (por ejemplo, publicación del cliente sui, llamada del cliente sui) puede aceptar el indicador --serialize-output para generar una transacción base64 para firmar. Sui admite múltiples esquemas de firma para la firma de transacciones, incluidas las firmas múltiples nativas.