Publicación
Comparte tu conocimiento.

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
- key
es 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 MyToken
instancia 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:
Habilidad | Significado |
---|---|
copy | Se puede duplicar |
drop | Puede desecharse sin destruirse |
store | Se puede almacenar en un almacenamiento global |
key | Se 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
key
ystore
no 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 Box
trabajar con cualquier tipo sin dejar de ser seguro y eficiente.
Nota: La
phantom
palabra clave indica que esoT
no 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.toml
Defina 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_context
ElSui 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 AdminCap
pueden 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 Table
este 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
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Gana tu parte de 1000 Sui
Gana puntos de reputación y obtén recompensas por ayudar a crecer a la comunidad de Sui.
- ¿Por qué BCS requiere un orden de campo exacto para la deserialización cuando las estructuras Move tienen campos con nombre?53
- «Errores de verificación de múltiples fuentes» en las publicaciones del módulo Sui Move: resolución automática de errores42
- Fallo en la transacción Sui: objetos reservados para otra transacción24
- ¿Cómo interactúan las restricciones de capacidad con los campos dinámicos en colecciones heterogéneas?04