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 denominan 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 SPL Token Basics para 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 acuñació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. Código fuente para ambos programas a continuación.
Token Program (Original)
- Capacidad básica de tokens (acuñar, transferir, etc.)
- Inmutable y ampliamente utilizado
Token Extension Program (Token 2022)
- Incluye todas las características del Token Program original
- Añade características 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 forma ú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:
- Supply: Suministro total del token
- Decimals: Precisión decimal del token
- Mint authority: La cuenta autorizada para crear nuevas unidades del token, aumentando el suministro
- Freeze authority: La cuenta autorizada para congelar tokens en una Token Account, impidiendo que sean transferidos o quemados
Cuenta Mint
Los detalles completos almacenados en cada cuenta mint 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 cuenta mint 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 cual la Token Account mantiene unidades
- Owner: La cuenta autorizada para transferir tokens desde la Token Account
- Amount: 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 desee 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 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 associated token account se crea con una dirección derivada de la dirección del propietario y la dirección de la mint account. Es importante entender que una associated token account es simplemente una token account con una dirección específica.
Esto introduce un concepto clave en el desarrollo de Solana: Program Derived Address (PDA). Un PDA deriva una dirección de forma determinista usando entradas predefinidas, lo que facilita encontrar la dirección de una cuenta.
Associated Token Account
Ten en cuenta que cada billetera necesita su propia token account para mantener tokens del mismo mint.
Relación de Cuentas Expandida
Ejemplos de Token CLI
El CLI spl-token te ayuda a experimentar con tokens SPL. Los ejemplos a
continuación usan la terminal de Solana Playground
para ejecutar comandos CLI directamente en el navegador sin instalación local.
Crear 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 billetera de
Playground y ejecuta el comando solana airdrop en la 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 el CLI spl-token localmente, ejecuta:
$cargo install spl-token-cli
Encuentra más ejemplos en la spl-token
documentación.
Las direcciones de cuenta mostradas en la salida de tu terminal difieren de los
ejemplos a continuación. Usa las direcciones de tu terminal de Playground al
seguir los pasos. Por ejemplo, el comando create-token genera una
dirección de mint account con tu billetera de Playground como la autoridad del
mint.
Crear un nuevo token
Para crear un nuevo token (mint account), ejecuta:
$spl-token create-token
El resultado 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 billetera 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 el Associated Token Program. Aquí hay un ejemplo en Javascript en Solana Playground.
El Associated Token Program usa Cross Program Invocations para:
- Invocar el System Program para crear una nueva cuenta usando el PDA proporcionado como dirección
- Invocar el 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 gestiona 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 Solana Explorer.
Obtén más información 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?