Estructura General del Módulo
Un token en Pact se organiza dentro de un módulo. Piensa en el módulo como una caja que contiene todo: datos, permisos y funciones. Esta es la estructura jerárquica:
Conceptos Clave
Guard (Guardián)
Define quién puede usar una cuenta. Generalmente es un keyset (conjunto de llaves públicas). Sin el guard correcto, nadie puede mover tus tokens.
Capability (Permiso)
Un permiso que debe activarse para ejecutar ciertas acciones. El atributo @managed significa que tiene un límite (ej: transferir máx X tokens).
Enforce (Verificar)
Verifica que una condición sea verdadera. Si es falsa, aborta toda la transacción. Es la base de la seguridad en Pact.
Table (Tabla)
Almacena datos en la blockchain. Cada cuenta tiene un registro con su balance y guard. Similar a una base de datos tradicional.
¿Por qué Capabilities?
Pact usa un modelo de seguridad basado en capacidades. En lugar de verificar permisos dentro de cada función, se "activan" los permisos necesarios al inicio y las funciones internas verifican que estén activos. Esto hace el código más seguro y fácil de auditar.
Código Explicado
Definición del Módulo
Todo comienza definiendo el módulo. El nombre debe ser único en toda la blockchain.
;; El nombre del módulo es único en toda la blockchain
;; GOVERNANCE_KEYSET define quién puede actualizar el código
(module mi-token ADMIN_KEYSET
;; Implementamos el estándar fungible-v2
;; Esto garantiza compatibilidad con wallets y exchanges
(implements fungible-v2)
(implements fungible-xchain-v1)
;; ... resto del código
)
Schema y Tabla de Cuentas
El schema define la estructura de datos. La tabla almacena los registros.
;; Estructura de cada cuenta:
;; - balance: cuántos tokens tiene
;; - guard: quién puede gastarlos
(defschema account-schema
balance:decimal ;; Cantidad de tokens
guard:guard ;; Autorización
)
;; Crea la tabla física en la blockchain
(deftable accounts-table:{account-schema})
Capabilities (Permisos)
Las capabilities son el corazón de la seguridad en Pact.
;; TRANSFER: Permiso para transferir tokens
;; @managed = tiene límite gestionado (no puedes exceder amount)
(defcap TRANSFER:bool
( sender:string
receiver:string
amount:decimal
)
@doc "Capability para transferir tokens"
@managed amount TRANSFER-mgr
;; Verificaciones de seguridad
(enforce (!= sender receiver) "No puedes enviarte a ti mismo")
(enforce (> amount 0.0) "La cantidad debe ser positiva")
;; Activa el permiso de débito automáticamente
(compose-capability (DEBIT sender))
)
;; DEBIT: Solo el dueño puede restar de su cuenta
(defcap DEBIT:bool (sender:string)
;; Verifica que quien firma es el dueño
(enforce-guard (at 'guard (read accounts-table sender)))
)
¿Qué es @managed?
Cuando una capability tiene @managed, el valor especificado (amount) actúa como un límite. Si intentas transferir más de lo autorizado en la firma, la transacción falla. Es una capa extra de seguridad.
Función de Transferencia
La función principal para mover tokens entre cuentas.
;; Transfiere tokens de sender a receiver
(defun transfer:string
(sender:string receiver:string amount:decimal)
@doc "Transfiere tokens de sender a receiver"
;; with-capability: "Activa" el permiso TRANSFER
;; Esto verifica que sender firmó y amount es válido
(with-capability (TRANSFER sender receiver amount)
;; Resta del sender
(debit sender amount)
;; Suma al receiver
(credit receiver
(at 'guard (read accounts-table receiver))
amount)
)
)
Flujo de una Transferencia
Cuando un usuario quiere transferir tokens, este es el proceso completo:
con Ecko Wallet
verifica firma
verifica guard
del sender
al receiver
Atomicidad
Si cualquier paso falla, toda la transacción se revierte. No hay estados intermedios. O se completa todo, o no se hace nada.
Tabla de Cuentas
Así se ve la tabla accounts-table en la blockchain:
| account (KEY) | balance | guard |
|---|---|---|
| k:abc123def456... | 1,000.00 | {keyset: "user-ks"} |
| k:789ghi012jkl... | 500.50 | {keyset: "user-ks-2"} |
| k:mno345pqr678... | 0.00 | {keyset: "new-user"} |
El prefijo k: indica que es una cuenta controlada por una llave pública. Es el formato estándar en Kadena.
Palabras Clave de Pact
Referencia rápida de las palabras clave más importantes:
Variables del Formulario
Estas son las variables que el formulario web reemplazará en la plantilla:
Errores Comunes
Cuando algo falla, estos son los mensajes más frecuentes:
Siempre verifica en Testnet primero
Antes de desplegar en mainnet, prueba tu token en testnet. Los errores en mainnet pueden ser costosos y permanentes.