Tu Primer Módulo Move
La blockchain de Aptos permite a los desarrolladores escribir smart contracts Turing complete (llamados “módulos”) con el lenguaje Move, que es seguro por diseño. Los smart contracts permiten a los usuarios enviar dinero a través de la blockchain, pero también escribir código arbitrario, ¡incluso juegos! Todo comienza con la CLI de Aptos creando una cuenta que almacenará el módulo Move al que se le hizo deploy (“publicado”).
Este tutorial te ayudará a entender los Módulos Move guiándote a través de la configuración de un entorno mínimo de Aptos, y luego cómo compilar, testear, publicar e interactuar con módulos Move en la Blockchain de Aptos. Aprenderás a:
- Configurar tu entorno e instalar la CLI
- Crear una cuenta en devnet y fondearla
- Compilar y testear un módulo Move
- Publicar (o “hacer deploy”) un módulo Move en la blockchain de Aptos
- Interactuar con el módulo
- Seguir construyendo con Aptos (siguientes pasos)
1. Configuración
Sección titulada «1. Configuración»Los cambios en la blockchain se llaman “transacciones”, y requieren una cuenta para pagar el network fee (“gas fee”). Necesitaremos crear una cuenta con algo de APT para pagar ese fee y ser dueños del contrato publicado. Para hacer esto, necesitaremos usar la CLI de Aptos.
-
Instalar la CLI de Aptos
Instala la CLI de Aptos (si aún no lo has hecho).
-
Abrir una nueva terminal
Abre una nueva ventana o pestaña de terminal.
-
Verificar la instalación
Ejecuta
aptos --versionpara verificar que la tienes instalada.Ventana de terminal aptos --versionDeberías ver una respuesta como
aptos 4.6.1. -
Crear una carpeta para el proyecto
Crea una nueva carpeta para este tutorial corriendo:
Ventana de terminal mkdir my-first-module -
Navegar a la carpeta del proyecto
Corre
cd my-first-modulepara entrar en tu nueva carpeta. -
Inicializar tu cuenta
Corre
aptos inity presiona ‘enter’ en cada paso de la configuración para crear una cuenta de prueba endevnet.Deberías ver un mensaje de éxito como este:
Ventana de terminal ---Aptos CLI is now set up for account 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba as profile default!{"Result": "Success"}
2. (Opcional) Explora lo que acabas de hacer On-Chain
Sección titulada «2. (Opcional) Explora lo que acabas de hacer On-Chain»-
Copia la address de tu cuenta
Copia la dirección (address) de la línea de comando de tu nueva cuenta.
La address se ve así
0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9bay puedes encontrarla en la línea:Ventana de terminal Aptos CLI is now set up for account 0x9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba as profile default! -
Abre el Aptos Explorer
Ve al Aptos Explorer.
Esta es la forma principal de chequear rápidamente qué está pasando en devnet, testnet o mainnet. Lo usaremos más adelante para ver nuestros contratos deployados.
-
Asegúrate de estar en la red Devnet.
Busca “Devnet” en la esquina superior derecha, o cambia de red haciendo clic en el menú desplegable “Mainnet” y seleccionando Devnet.

-
Busca tu cuenta
Pega tu address recién creada en la barra de búsqueda.
-
Ver los resultados de búsqueda
Espera a que aparezcan los resultados, luego haz clic en el primer resultado.
-
Chequear la transacción
Deberías ver tu cuenta recién creada y una transacción con la función faucet, fondeándola con tokens de devnet.

-
Verificar tu balance
Haz clic en la pestaña “Coins” para ver que tienes 1 APT de Aptos Coin. Esto te permitirá publicar e interactuar con smart contracts en la devnet de Aptos.
3. Escribiendo y Compilando Tu Primer Módulo
Sección titulada «3. Escribiendo y Compilando Tu Primer Módulo»Ahora que tenemos nuestro entorno configurado y una cuenta creada, escribamos y compilemos nuestro primer módulo Move. A diferencia de Ethereum, donde los contratos existen de forma independiente, Move ata todo a las cuentas: tanto los módulos como sus recursos. Empecemos con un ejemplo simple para entender los conceptos clave.

Este diagrama ilustra la relación entre la propiedad del módulo, la propiedad del token y el estado de la blockchain de Move. Ayuda a visualizar cómo los módulos y recursos están atados a las cuentas, enfatizando los aspectos únicos del diseño de Move en comparación con otras plataformas blockchain.
¿Qué es un Módulo Move?
Sección titulada «¿Qué es un Módulo Move?»Los módulos Move son similares a los smart contracts en otras blockchains, con algunas diferencias clave:
- Recursos: A diferencia de Solidity, donde el estado se almacena en variables del contrato, Move usa “recursos” (resources): tipos de datos especiales que solo pueden existir en un lugar a la vez y siempre están atados a una cuenta.
- Basado en Módulos: En lugar de deployar contratos enteros como unidades independientes como en Solidity, el código Move se organiza en módulos reutilizables que pueden compartir y manejar recursos a través de límites. Los módulos son más como paquetes de una librería estándar que pueden publicarse juntos o por separado, ofreciendo un control más granular sobre la organización del código.
- Seguridad por diseño: El sistema de tipos de Move y la semántica de recursos ayudan a prevenir vulnerabilidades comunes de los smart contracts.
Tu Primer Módulo Move
Sección titulada «Tu Primer Módulo Move»Antes de empezar, ve a tu VSCode (o Cursor) e instala la extensión de VSCode Move On Aptos.
- Abre VSCode (o Cursor) y navega a la pestaña de Extensiones.
- Busca
Move On Aptospublicada poraptoslabse instala la extensión.
Esta extensión nos ayudará con el resaltado de sintaxis, autocompletado y otras características que harán nuestra experiencia de desarrollo más fácil.
Nuestro primer módulo será un sistema simple de almacenamiento de mensajes que permite a las cuentas guardar y recuperar mensajes. Creemos un nuevo proyecto Move dentro de nuestra carpeta my-first-module:
-
Inicializar el proyecto
Inicializa un nuevo proyecto Move con
aptos move init --name my_first_moduleEsto crea una estructura de proyecto con un directorio
sourcesy un archivoMove.toml. -
Crear el archivo del módulo
Crea un nuevo archivo
sources/message.movecon el código de nuestro módulo:module my_first_module::message {use std::string;use std::signer;struct MessageHolder has key, store, drop {message: string::String,}public entry fun set_message(account: &signer, message: string::String) acquires MessageHolder {let account_addr = signer::address_of(account);if (exists<MessageHolder>(account_addr)) {move_from<MessageHolder>(account_addr);};move_to(account, MessageHolder { message });}public fun get_message(account_addr: address): string::String acquires MessageHolder {assert!(exists<MessageHolder>(account_addr), 0);let message_holder = borrow_global<MessageHolder>(account_addr);message_holder.message}}Desglosemos este módulo:
- Definimos un tipo de recurso
MessageHolderque puede almacenar un mensaje de tipo string. set_messagepermite a una cuenta almacenar un mensaje.get_messagepermite a cualquiera recuperar un mensaje almacenado.- La palabra clave
acquiresindica a qué recursos necesitan acceso las funciones (MessageHolder, en este caso). move_toymove_frommanejan el almacenamiento de recursos bajo las cuentas.
- Definimos un tipo de recurso
-
Compilar el módulo
Compila el módulo Move que acabamos de crear con
aptos move compile --named-addresses my_first_module=defaultDeberías ver un mensaje como este si tuvo éxito:
Ventana de terminal ❯ aptos move compile --named-addresses my_first_module=defaultCompiling, may take a little while to download git dependencies...UPDATING GIT DEPENDENCY https://github.com/aptos-labs/aptos-framework.gitINCLUDING DEPENDENCY AptosFrameworkINCLUDING DEPENDENCY AptosStdlibINCLUDING DEPENDENCY MoveStdlibBUILDING my_first_module{"Result": ["9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba::message"]}
¡Buen trabajo! Ahora estamos listos para testear y debuggear.
4. Testing y Debugging
Sección titulada «4. Testing y Debugging»Testing y debugging son partes cruciales del desarrollo de módulos Move. Move tiene soporte nativo para unit testing e impresión de debug (debug printing).
-
Agregar debug prints
Primero, modifiquemos nuestro módulo de mensajes para agregar algunos debug prints. Actualiza tu
sources/message.move:module my_first_module::message {use std::string;use std::signer;use std::debug; // Agrega esto para los debug printsstruct MessageHolder has key, store, drop {message: string::String,}public entry fun set_message(account: &signer, message: string::String) acquires MessageHolder {let account_addr = signer::address_of(account);debug::print(&message); // Imprimir el mensaje que se está guardandoif (exists<MessageHolder>(account_addr)) {debug::print(&string::utf8(b"Updating existing message")); // Imprimir info de debugmove_from<MessageHolder>(account_addr);} else {debug::print(&string::utf8(b"Creating new message")); // Imprimir al crear nuevo};move_to(account, MessageHolder { message });}public fun get_message(account_addr: address): string::String acquires MessageHolder {assert!(exists<MessageHolder>(account_addr), 0);let message_holder = borrow_global<MessageHolder>(account_addr);debug::print(&message_holder.message); // Imprimir el mensaje recuperadomessage_holder.message}} -
Crear archivo de test
Crea nuestros tests: un nuevo archivo
sources/message_tests.movecon:#[test_only]module my_first_module::message_tests {use std::string;use std::signer;use my_first_module::message;#[test(sender= @my_first_module)]fun test_set_and_get_message(sender: &signer) {// Test setting a messagemessage::set_message(sender, string::utf8(b"Hello World"));// Verify the message was set correctlylet stored_message = message::get_message(signer::address_of(sender));assert!(stored_message == string::utf8(b"Hello World"), 0)}#[test(sender=@my_first_module)]fun test_update_message(sender: &signer) {// Test setting a messagemessage::set_message(sender, string::utf8(b"Hello World"));// Test updating the messagemessage::set_message(sender, string::utf8(b"Hello Aptos"));// Verify the message was updated correctlylet stored_message = message::get_message(signer::address_of(sender));assert!(stored_message == string::utf8(b"Hello Aptos"), 0)}} -
Correr los tests
Ahora corre los tests con
aptos move test --named-addresses my_first_module=defaultDeberías ver el output si los tests pasan: (Mira abajo para ver cómo manejar errores)
Ventana de terminal INCLUDING DEPENDENCY AptosFrameworkINCLUDING DEPENDENCY AptosStdlibINCLUDING DEPENDENCY MoveStdlibBUILDING my_first_moduleRunning Move unit tests[debug] "Hello World"[debug] "Creating new message"[debug] "Hello World"[ PASS ] 0x852a264419a80b27771f072b5cae8c8b358d4450e135e134e065247376a4357a::message_tests::test_set_and_get_message[debug] "Hello World"[debug] "Creating new message"[debug] "Hello Aptos"[debug] "Updating existing message"[debug] "Hello Aptos"[ PASS ] 0x852a264419a80b27771f072b5cae8c8b358d4450e135e134e065247376a4357a::message_tests::test_update_messageTest result: OK. Total tests: 2; passed: 2; failed: 0{"Result": "Success"}
Si encuentras errores al testear, aquí hay algunos problemas y soluciones comunes:
- Asegúrate de que todas las dependencias del módulo estén importadas correctamente.
- Chequea que la address de tu cuenta coincida en el parámetro
-named-addresses. - Verifica que las funciones de test tengan el atributo
#[test]. - Asegúrate de que los string literals estén codificados correctamente.
5. Publicando tu Módulo
Sección titulada «5. Publicando tu Módulo»Después de compilar y testear exitosamente tu módulo, puedes publicarlo en la blockchain de Aptos. Este proceso hace el deploy de tu código para que sea accesible on-chain.
-
Publicar el módulo
Publica tu módulo con
aptos move publish --named-addresses my_first_module=defaultVerás un output mostrando el proceso de compilación y luego un prompt preguntando sobre los gas fees:
Ventana de terminal Compiling, may take a little while to download git dependencies...UPDATING GIT DEPENDENCY https://github.com/aptos-labs/aptos-framework.gitINCLUDING DEPENDENCY AptosFrameworkINCLUDING DEPENDENCY AptosStdlibINCLUDING DEPENDENCY MoveStdlibBUILDING my_first_modulepackage size 1271 bytesDo you want to submit a transaction for a range of [141300 - 211900] Octas at a gas unit price of 100 Octas? [yes/no] > -
Confirmar la transacción
Escribe
yy presiona Enter para confirmar la transacción.Después de la confirmación, recibirás una respuesta mostrando los detalles de la transacción:
Ventana de terminal {"Result": {"transaction_hash": "0x95fce7344b066abda10c07dbf1ffa83e0d9c7bd400e2b143682a6c8a5f179dc2","gas_used": 1413,"gas_unit_price": 100,"sender": "9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba","sequence_number": 0,"success": true,"timestamp_us": 1735351260227638,"version": 273029731,"vm_status": "Executed successfully"}}
(Opcional) Ver tu Contrato On-Chain
Sección titulada «(Opcional) Ver tu Contrato On-Chain»Después de una publicación exitosa, puedes verificar que tu módulo está on-chain siguiendo estos pasos:
-
Abre el Explorer
Ve al Aptos Explorer
-
Chequear la transacción
Busca la address de tu cuenta. Deberías notar que hay una nueva transacción en tu cuenta, la función
code::publish_package_txn. -
Ver tu balance
Haz clic en la pestaña “Coins” para ver que ahora tienes menos de 1 APT de Aptos Coin.

Has gastado una pequeña cantidad en gas para deployar el contrato, así que deberías tener alrededor de
0.99855 APTrestantes. -
Encontrar tu módulo
Busca bajo la pestaña “Modules”

-
Verificar el módulo
Deberías ver tu módulo “message” listado.
6. Interactuando con tu Módulo
Sección titulada «6. Interactuando con tu Módulo»Ahora que tu módulo está publicado, puedes interactuar con él a través de la CLI de Aptos:
-
Configurar un mensaje
Configura un mensaje usando la CLI:
Ventana de terminal aptos move run --function-id 'default::message::set_message' --args 'string:Hello, Aptos!'Verás un prompt de gas fee similar al que viste durante la publicación.
-
Confirmar la transacción
Después de confirmar con
y, deberías obtener una respuesta de éxito como:Ventana de terminal Transaction submitted: https://explorer.aptoslabs.com/txn/0x0c0b1e56a31d037280278327eb8fdfcc469a20213e5e65accf6e7c56af574449?network=devnet{"Result": {"transaction_hash": "0x0c0b1e56a31d037280278327eb8fdfcc469a20213e5e65accf6e7c56af574449","gas_used": 445,"gas_unit_price": 100,"sender": "9ec1cfa30b885a5c9d595f32f3381ec16d208734913b587be9e210f60be9f9ba","sequence_number": 1,"success": true,"timestamp_us": 1735351754495208,"version": 273137362,"vm_status": "Executed successfully"}} -
Ver tu mensaje
Mira tu mensaje almacenado revisando bajo Resources en el Explorer.
-
¡Celebra!
¡Lo logramos!
Siguientes Pasos
Sección titulada «Siguientes Pasos»¡Felicitaciones! Has logrado exitosamente:
- Compilar tu primer módulo Move
- Agregar tests para ayudar a debuggear
- Publicar tu módulo on-chain
- Usar tu contrato a través de la CLI
¡Ahora tu módulo Move publicado puede ser conectado justo como una API a través de uno de nuestros muchos SDKs Oficiales!
Aquí hay algunos siguientes pasos sugeridos para obtener un entendimiento más profundo de los módulos Move:
- Intenta modificar el módulo para agregar una nueva funcionalidad. Puedes usar el Move Book para construir tu conocimiento sobre cómo escribir módulos Move.
- Para entender cómo funciona Move on-chain, puedes aprender sobre el sistema de recursos de Move.
- Si estás construyendo una aplicación para interactuar con contratos o buscar datos on-chain, aprende cómo usar los SDKs aquí.
- Únete al Discord de Aptos para conectar con otros desarrolladores.