Tokens en Solana
Los tokens son activos digitales que representan la propiedad sobre diversas categorías de activos. La tokenización permite la digitalización de los derechos de propiedad. Los tokens en Solana se conocen como Tokens SPL (Solana Program Library).
Esta sección cubre los conceptos básicos de cómo se representan los tokens en Solana. Consulta la sección Conceptos básicos de SPL Token para ver ejemplos de código.
Puntos clave
-
Los Token Programs contienen toda la lógica de instrucciones para interactuar con tokens en la red (tanto fungibles como no fungibles).
-
Una Mint Account representa un token específico y almacena metadatos globales sobre el token como el suministro total y la autoridad de emisión (dirección autorizada para crear nuevas unidades de un token).
-
Una Token Account rastrea la propiedad individual de tokens para una mint account específica y un propietario específico.
-
Una Associated Token Account es una Token Account creada con una dirección derivada de las direcciones del propietario y la mint account.
Token Programs
El ecosistema de Solana tiene dos Token Programs principales. El código fuente para ambos programas a continuación.
Token Program (Original)
- Capacidad básica de token (emisión, transferencia, etc.)
- Inmutable y ampliamente utilizado
Token Extension Program (Token 2022)
- Incluye todas las características del Token Program original
- Añade funcionalidades a través de "extensiones"
Los Token Programs contienen toda la lógica de instrucciones para interactuar con tokens en la red (tanto fungibles como no fungibles). Todos los tokens en Solana son efectivamente cuentas de datos propiedad de un Token Program.
Token Program
Mint Account
Los tokens en Solana se identifican de manera única por la dirección de una Mint Account propiedad del Token Program. Esta cuenta actúa como un contador global para un token específico y almacena datos como:
- Suministro: Suministro total del token
- Decimales: Precisión decimal del token
- Autoridad de emisión: La cuenta autorizada para crear nuevas unidades del token, aumentando el suministro
- Autoridad de congelación: La cuenta autorizada para congelar tokens en una Token Account, impidiendo que sean transferidos o quemados
Mint Account
Los detalles completos almacenados en cada Mint Account incluyen lo siguiente:
pub struct Mint {/// Optional authority used to mint new tokens. The mint authority may only/// be provided during mint creation. If no mint authority is present/// then the mint has a fixed supply and no further tokens may be/// minted.pub mint_authority: COption<Pubkey>,/// Total supply of tokens.pub supply: u64,/// Number of base 10 digits to the right of the decimal place.pub decimals: u8,/// Is `true` if this structure has been initializedpub is_initialized: bool,/// Optional authority to freeze token accounts.pub freeze_authority: COption<Pubkey>,}
Como referencia, aquí hay un enlace de Solana Explorer a la Mint Account de USDC.
Token Account
El Token Program crea Token Accounts para rastrear la propiedad individual de cada unidad de token. Una Token Account almacena datos como:
- Mint: El token del que la Token Account mantiene unidades
- Propietario: La cuenta autorizada para transferir tokens desde la Token Account
- Cantidad: Número de tokens que la Token Account mantiene actualmente
Token Account
Los detalles completos almacenados en cada Token Account incluyen lo siguiente:
pub struct Account {/// The mint associated with this accountpub mint: Pubkey,/// The owner of this account.pub owner: Pubkey,/// The amount of tokens this account holds.pub amount: u64,/// If `delegate` is `Some` then `delegated_amount` represents/// the amount authorized by the delegatepub delegate: COption<Pubkey>,/// The account's statepub state: AccountState,/// If is_native.is_some, this is a native token, and the value logs the/// rent-exempt reserve. An Account is required to be rent-exempt, so/// the value is used by the Processor to ensure that wrapped SOL/// accounts do not drop below this threshold.pub is_native: COption<u64>,/// The amount delegatedpub delegated_amount: u64,/// Optional authority to close the account.pub close_authority: COption<Pubkey>,}
Una wallet necesita una token account para cada token (mint) que quiera mantener, con la dirección de la wallet establecida como propietaria de la token account. Cada wallet puede poseer múltiples token accounts para el mismo token (mint), pero una token account solo puede tener un propietario y mantener unidades de un solo token (mint).
Relación de Cuentas
Ten en cuenta que los datos de cada Token Account incluyen un campo owner
que
identifica quién tiene autoridad sobre la Token Account. Esto difiere del
propietario del programa especificado en el tipo base
Account, que es el Token Program para todas
las Token Accounts.
Associated Token Account
Las Associated Token Accounts simplifican el proceso de encontrar la dirección de una token account para un mint y propietario específicos. Piensa en la Associated Token Account como la token account "predeterminada" para un mint y propietario específicos.
Una Cuenta de Token Asociada se crea con una dirección derivada de la dirección del propietario y la dirección de la cuenta mint. Es importante entender que una Cuenta de Token Asociada es simplemente una cuenta de token con una dirección específica.
Esto introduce un concepto clave en el desarrollo de Solana: Program Derived Address (PDA). Una PDA deriva una dirección de manera determinista utilizando entradas predefinidas, facilitando encontrar la dirección de una cuenta.
Cuenta de Token Asociada
Ten en cuenta que cada wallet necesita su propia cuenta de token para mantener tokens del mismo mint.
Relación de Cuentas Expandida
Ejemplos de CLI de Token
La CLI spl-token
te ayuda a experimentar con tokens SPL. Los ejemplos a
continuación utilizan el terminal de Solana Playground
para ejecutar comandos CLI directamente en el navegador sin instalación local.
La creación de tokens y cuentas requiere SOL para depósitos de rent de cuentas y
tarifas de transacción. Para usuarios nuevos de Solana Playground, crea una
wallet de Playground y ejecuta el comando solana airdrop
en el terminal de
Playground. También puedes obtener SOL de devnet desde el
faucet web público.
$solana airdrop 2
Ejecuta spl-token --help
para ver todos los comandos disponibles.
$spl-token --help
Para instalar la CLI spl-token
localmente, ejecutar:
$cargo install spl-token-cli
Encuentra más ejemplos en la
documentación de spl-token
.
Las direcciones de cuenta mostradas en la salida de tu terminal difieren de los
ejemplos de abajo. Usa las direcciones de tu terminal de Playground cuando sigas
los pasos. Por ejemplo, el comando create-token
muestra una dirección de
cuenta mint con tu wallet de Playground como autoridad del mint.
Crear un Nuevo Token
Para crear un nuevo token (cuenta mint), ejecuta:
$spl-token create-token
La salida se ve así:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Una nueva mint account comienza con suministro cero. Verifica el suministro actual con:
$spl-token supply <TOKEN_ADDRESS>
El comando supply
para un nuevo token devuelve 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Crear una nueva Mint Account requiere una transacción con dos instrucciones. Aquí hay un ejemplo en Javascript en Solana Playground.
-
El System Program crea una nueva cuenta con espacio para los datos de la Mint Account y transfiere la propiedad al Token Program.
-
El Token Program inicializa los datos de la nueva cuenta como una Mint Account
Crear Token Account
Para mantener tokens de un mint específico, crea una token account:
$spl-token create-account <TOKEN_ADDRESS>
Ejemplo de comando:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Resultado:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
El comando create-account
crea una associated token account con la
dirección de tu wallet como propietario.
Para crear una token account con un propietario diferente:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Nota: <TOKEN_ADDRESS>
especifica la mint account para la token account.
Ejemplo de comando:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Resultado:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Crear una Associated Token Account requiere una instrucción que invoca al Associated Token Program. Aquí hay un ejemplo en Javascript en Solana Playground.
El Associated Token Program utiliza Cross Program Invocations para:
- Invocar al System Program para crear una nueva cuenta usando el PDA proporcionado como dirección
- Invocar al Token Program para inicializar los datos de la Token Account
Para crear una nueva Token Account con un nuevo keypair en lugar de una dirección de Associated Token Account, envía una transacción con dos instrucciones. Aquí hay un ejemplo en Javascript en Solana Playground.
-
El System Program crea una nueva cuenta con espacio para los datos de la Token Account y transfiere la propiedad al Token Program.
-
El Token Program inicializa los datos como una Token Account
Acuñar tokens
Para crear nuevas unidades de un token, acuña tokens a una Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Ejemplo de comando:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Resultado:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Para acuñar tokens a una token account diferente:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Resultado:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
La instrucción MintTo
en el Token Program crea nuevos tokens. La autoridad
de acuñación debe firmar la transacción. La instrucción acuña tokens a una Token
Account y aumenta el suministro total en la Mint Account. Aquí hay un ejemplo en
Javascript en
Solana Playground.
Transferir tokens
Para transferir tokens entre token accounts:
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>
Ejemplo de comando:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Resultado:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
La instrucción Transfer
en el Token Program maneja las transferencias de
tokens. El propietario de la Token Account del remitente debe firmar la
transacción. La instrucción mueve tokens entre Token Accounts. Aquí hay un
ejemplo en Javascript en
Solana Playground.
Tanto el remitente como el destinatario necesitan token accounts para el token específico (mint). El remitente puede incluir instrucciones para crear la token account del destinatario en la misma transacción.
Crear metadatos de token
El Token Extensions Program te permite almacenar metadatos (nombre, símbolo, enlace de imagen) directamente en la Mint Account.
Para crear un token con extensión de metadatos:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Resultado:
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEbTo initialize metadata inside the mint, please run `spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>`, and sign with the mint authority.Address: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczPDecimals: 9Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai
Para inicializar los metadatos:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
El URI del token enlaza a metadatos fuera de la cadena. Consulta un ejemplo de formato JSON aquí.
Ejemplo de comando:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Visualiza los metadatos en el Explorador de Solana.
Aprende más en la Guía de Extensión de Metadatos. Para detalles sobre Token Extensions, consulta la Guía de Inicio de Token Extensions y la documentación de SPL.
Is this page helpful?