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.

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 ProgramToken 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 AccountMint Account

Los detalles completos almacenados en cada Mint Account incluyen lo siguiente:

Mint Account State
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 initialized
pub 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 AccountToken Account

Los detalles completos almacenados en cada Token Account incluyen lo siguiente:

Token Account State
pub struct Account {
/// The mint associated with this account
pub 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 delegate
pub delegate: COption<Pubkey>,
/// The account's state
pub 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 delegated
pub 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 CuentasRelació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 AsociadaCuenta 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 ExpandidaRelació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.

Terminal
$
solana airdrop 2

Ejecuta spl-token --help para ver todos los comandos disponibles.

Terminal
$
spl-token --help

Para instalar la CLI spl-token localmente, ejecutar:

Terminal
$
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:

Terminal
$
spl-token create-token

La salida se ve así:

Terminal Output
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Address: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Decimals: 9
Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1

Una nueva mint account comienza con suministro cero. Verifica el suministro actual con:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

El comando supply para un nuevo token devuelve 0:

Example
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.

  1. El System Program crea una nueva cuenta con espacio para los datos de la Mint Account y transfiere la propiedad al Token Program.

  2. 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:

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Ejemplo de comando:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Resultado:

Terminal Output
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 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:

Terminal
$
spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>

Nota: <TOKEN_ADDRESS> especifica la mint account para la token account.

Ejemplo de comando:

Example
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Resultado:

Terminal Output
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 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:

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.

  1. El System Program crea una nueva cuenta con espacio para los datos de la Token Account y transfiere la propiedad al Token Program.

  2. 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:

Terminal
$
spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]

Ejemplo de comando:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Resultado:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG

Para acuñar tokens a una token account diferente:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Resultado:

Terminal Output
Minting 100 tokens
Token: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 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:

Terminal
spl-token transfer [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> <RECIPIENT_ADDRESS or RECIPIENT_TOKEN_ACCOUNT_ADDRESS>

Ejemplo de comando:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Resultado:

Terminal Output
Transfer 100 tokens
Sender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9
Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Signature: 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:

Example
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata

Resultado:

Terminal Output
Creating token BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP under program TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
To 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: BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP
Decimals: 9
Signature: 5iQofFeXdYhMi9uTzZghcq8stAaa6CY6saUwcdnELST13eNSifiuLbvR5DnRt311frkCTUh5oecj8YEvZSB3wfai

Para inicializar los metadatos:

Terminal
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:

Example
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?

Tabla de Contenidos

Editar Página