Sui.

Publicación

Comparte tu conocimiento.

article banner.
MiniBob.
Jul 01, 2025
Artículo

Dominar los conceptos del lenguaje en movimiento — Curso #2

Si bien elCurso #1 que he hecho anteriormente te ha enseñado los conceptos básicos para escribir contratos inteligentes en Move y crear dApps sencillas en la cadena de bloques Sui, este curso se centra enprofundizar tu comprensión del propio lenguaje Move, desde su potente sistema de tipos hasta patrones avanzados como genéricos, eventos, módulos y mecanismos de control de acceso.

Al final de este curso, podrás:

  • Escribe código Move modular, reutilizable y seguro
  • Usa genéricos, habilidades y tipos de recursos de manera efectiva
  • Implemente un control de acceso detallado mediante capacidades
  • Emita y escuche eventos para la integración fuera de la cadena
  • Trabaja con estructuras de datos complejas, como tablas y vectores
  • Comprenda en qué se diferencia Move de otros lenguajes de contratos inteligentes como Solidity

¡Sumérjase en el corazón del lenguaje de Move!

Paso 1: Entender las principales características lingüísticas de Move

Move está diseñado pensando en la seguridad y la claridad. Analicemos algunas de las características más importantes que hacen que Move sea único como lenguaje de contratos inteligentes.

1.1 Programación orientada a los recursos (revisada)

La esencia de Move es el concepto derecursos, que son tipos especiales que no se pueden copiar ni eliminar a menos que se permita explícitamente. Esto refuerza el manejo seguro de los activos digitales, como los tokens o los NFT.

module examples::token {
    use sui::object::{Self, UID};

    struct MyToken has key, store {
        id: UID,
        value: u64,
    }

    public fun mint(ctx: &mut TxContext): MyToken {
        MyToken {
            id: object::new(ctx),
            value: 100,
        }
    }
}

En este ejemplo: MyToken- keyes unrecursoporque tiene la capacidad. store- Puede almacenarse (id) e identificarse de forma única por su.

  • No se puede duplicar ni eliminar a menos que se especifique lo contrario.

Esto garantiza que cada MyTokeninstancia tenga una propiedad y una administración únicas, lo que evita la duplicación o la eliminación accidental.


1.2 Sistema de habilidades

Cada tipo de movimiento tiene un conjunto dehabilidadesque definen las operaciones que admite:

HabilidadSignificado
copySe puede duplicar
dropPuede desecharse sin destruirse
storeSe puede almacenar en un almacenamiento global
keySe puede usar como una estructura con un campo de identificación (es decir, un objeto)

Ejemplo:

struct Example has copy, drop { value: u64 }

Comprender estas habilidades es esencial para diseñar contratos inteligentes seguros y predecibles.

Por qué son importantes las habilidades

Las habilidades imponen reglas estrictas en el momento de la compilación. Por ejemplo:

  • Una estructura que solo tiene keyy storeno se puede copiar ni borrar.
  • No puedes devolver una estructura que no se pueda borrar de una función a menos que esté almacenada o transferida.

Esto evita errores como el doble gasto o la pérdida accidental de fichas.


1.3 Parámetros genéricos y de tipo

Move admite tipos genéricos, lo que permite a los desarrolladores escribir código flexible y reutilizable.

module examples::storage {
    use sui::object::{Self, UID};

    struct Box<phantom T> has key {
        id: UID,
        content: T,
    }

    public fun new_box<T>(ctx: &mut TxContext, content: T): Box<T> {
        Box {
            id: object::new(ctx),
            content,
        }
    }
}

Aquí <T>hay unparámetro de tipo, que permite Boxtrabajar con cualquier tipo sin dejar de ser seguro y eficiente.

Nota: La phantompalabra clave indica que eso Tno afecta a la representación de la estructura en tiempo de ejecución, lo que resulta útil para el modelado abstracto.


Paso 2: Desarrollo modular y gestión de paquetes

A medida que sus proyectos de Move aumentan en complejidad, la organización del código se vuelve fundamental.

2.1 Creación y publicación de paquetes de Move

Unpaquete Movecontiene uno o más módulos y define las dependencias. Es la unidad de implementación y control de versiones en Move.

Estructura de directorios:

sources/
  place.move
  user.move
Move.toml

Move.tomlDefina las dependencias en:

[dependencies]
Sui = { git = "https://github.com/MystenLabs/sui.git", subdir = "crates/sui-framework" }
MyLibrary = { local = "../my-library" }

Puede publicar paquetes en la red Sui y reutilizarlos en varias dApps.

2.2 Reutilización de los módulos existentes

coin``transfer``tx_contextElSui Frameworkproporciona módulos probados en batalla como, y. Comprueba siempre lo que está disponible antes de escribir una lógica personalizada.

Por ejemplo, para transferir un objeto:

use sui::transfer;

public entry fun send_place(place: Place, recipient: address) {
    transfer::public_transfer(place, recipient);
}

El uso de bibliotecas estándar garantiza un desarrollo más rápido y seguro y una mejor interoperabilidad.


Paso 3: Eventos y comunicación fuera de la cadena

Para crear aplicaciones reales, tus contratos de Move deben comunicarse con sistemas fuera de la cadena, como interfaces o indexadores.

3.1 Emisión de eventos

Move permite emitireventosque pueden ser indexados por servicios externos.

use sui::event;

struct PlaceCreated has drop {
    name: String,
}

public fun emit_place_created(name: String) {
    event::emit(PlaceCreated { name });
}

Este evento aparecerá en la cadena de bloques y los exploradores o las herramientas de indexación pueden recogerlo.

3.2 Escuchando eventos

Usa herramientas comoSuite Explorer,Subsquido la API JSON-RPC de Sui para detectar los eventos emitidos y reaccionar en consecuencia en tu aplicación.

En Javascript/TypeScript:

import { JsonRpcProvider } from '@mysten/sui.js';

const provider = new JsonRpcProvider('https://fullnode.devnet.sui.io');

const events = await provider.getEvents({
  MoveEventType: '0x...::example::PlaceCreated'
});

Paso 4: Patrones de control de acceso y seguridad

La seguridad es primordial cuando se trata de contratos inteligentes. Move proporciona varias herramientas para implementar un control de acceso sólido.

4.1 Modelo de propiedad de objetos

Sui impone la propiedad a nivel de protocolo. Solo el propietario de un objeto puede mutarlo o transferirlo.

public entry fun update_name(sweet_place: &mut SweetPlace, new_name: String) {
    sweet_place.name = new_name;
}

Solo el propietario actual puede llamar a esta función.

4.2 Patrón de capacidades

Para obtener permisos más detallados, usa elpatrón de capacidades: crea objetos especiales que otorguen acceso limitado a ciertas funciones.

struct AdminCap has key { id: UID }

public entry fun grant_admin_cap(ctx: &mut TxContext) {
    let cap = AdminCap { id: object::new(ctx) };
    transfer::public_transfer(cap, tx_context::sender(ctx));
}

public entry fun restricted_action(_: &AdminCap) {
    // perform admin action
}

Ahora solo los usuarios que tengan el AdminCappueden ejecutarrestricted_action.

Este patrón se usa ampliamente en DeFi y DAoS para delegar la autoridad de forma segura.


Paso 5: Trabajar con estructuras de datos complejas

Move admite tipos de datos estructurados que permiten a los desarrolladores modelar relaciones y lógicas complejas.

5.1 Vectores

Los vectores se utilizan para almacenar colecciones ordenadas de elementos del mismo tipo.

let names = vector[String::utf8(b"Alice"), String::utf8(b"Bob")];

Son útiles para almacenar listas de NFT, funciones de usuario o metadatos dinámicos.

Ejemplo de uso:

vector::push_back(&mut names, String::utf8(b"Charlie"));

5.2 Tablas (a través de la biblioteca estándar Sui)

Si bien Move no admite mapas ni tablas hash de forma nativa, Sui proporciona Tableeste tipo en su biblioteca estándar.

use sui::table::{Self, Table};

struct Registry has key {
    id: UID,
    entries: Table<u64, String>,
}

public fun add_entry(registry: &mut Registry, key: u64, value: String) {
    table::add(&mut registry.entries, key, value);
}

Use tablas para administrar grandes conjuntos de datos de manera eficiente.


Paso 6: Probar y depurar sus contratos

Las pruebas garantizan que tu código Move se comporte según lo esperado en diversas condiciones.

6.1 Pruebas unitarias en Move

Escribe las pruebas unitarias directamente en tus módulos de Move utilizando el marco de pruebas.

#[test]
public fun test_create_sweet_place() {
    let ctx = tx_context::dummy();
    create_sweet_place(&mut ctx, String::utf8(b"My House"));
}

Ejecute pruebas con:

sui move test

6.2 Uso de Sui Explorer

Después de implementar tu contrato, usa el Sui Explorer para inspeccionar las transacciones, ver los estados de los objetos y solucionar problemas.


Paso 7: Aplicaciones en el mundo real de los conceptos de movimiento avanzados

Ahora que entiendes las principales características del lenguaje, exploremos cómo se aplican a situaciones del mundo real.

7.1 Plataforma de acuñación NFT

Cree una plataforma que permita a los usuarios acuñar NFT con el respaldo de los recursos de Move, aprovechando los modelos de propiedad y recursos.

7.2 Sistema de votación DAO

Implemente una organización autónoma descentralizada (DAO) con Move para votar, presentar propuestas y gobernar, utilizando eventos y capacidades para llevar a cabo acciones seguras.

7.3 Intercambios de tokens y AMM

Cree una bolsa descentralizada (DEX) utilizando los módulos Move para representar los fondos de liquidez y las permutas de tokens, utilizando genéricos y tablas para una gestión estatal eficiente.

  • Sui
  • Architecture
  • Move
2
Cuota
Comentarios
.