Tokens na Solana
Tokens são ativos digitais que representam propriedade sobre diversas categorias de ativos. A tokenização permite a digitalização dos direitos de propriedade. Os tokens na Solana são chamados de SPL (Solana Program Library) Tokens.
Esta seção aborda os conceitos básicos de como os tokens são representados na Solana. Consulte a seção Fundamentos de SPL Token para exemplos de código.
Pontos-chave
-
Os Token Programs contêm toda a lógica de instrução para interagir com tokens na rede (tanto fungíveis quanto não fungíveis).
-
Uma Mint Account representa um token específico e armazena metadados globais sobre o token, como o fornecimento total e a autoridade de emissão (endereço autorizado a criar novas unidades de um token).
-
Uma Token Account rastreia a propriedade individual de tokens para uma mint account específica para um proprietário específico.
-
Uma Associated Token Account é uma Token Account criada com um endereço derivado dos endereços do proprietário e da mint account.
Token Programs
O ecossistema Solana possui dois Token Programs principais. Código-fonte para ambos os programas abaixo.
Token Program (Original)
- Capacidade básica de token (emissão, transferência, etc.)
- Imutável e amplamente utilizado
Token Extension Program (Token 2022)
- Inclui todos os recursos do Token Program original
- Adiciona recursos através de "extensões"
O Token Program contém toda a lógica de instrução para interagir com tokens na rede (tanto fungíveis quanto não fungíveis). Todos os tokens na Solana são efetivamente contas de dados pertencentes a um Token Program.
Token Program
Mint Account
Os tokens na Solana são identificados exclusivamente pelo endereço de uma Mint Account pertencente ao Token Program. Esta conta atua como um contador global para um token específico e armazena dados como:
- Fornecimento: Fornecimento total do token
- Decimais: Precisão decimal do token
- Autoridade de emissão: A conta autorizada a criar novas unidades do token, aumentando o fornecimento
- Autoridade de congelamento: A conta autorizada a congelar tokens em uma Token Account, impedindo que sejam transferidos ou queimados
Mint Account
Os detalhes completos armazenados em cada Mint Account incluem o seguinte:
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>,}
Para referência, aqui está um link do Solana Explorer para a Mint Account do USDC.
Token Account
O Token Program cria Token Accounts para rastrear a propriedade individual de cada unidade de token. Uma Token Account armazena dados como:
- Mint: O token que a Token Account mantém unidades
- Proprietário: A conta autorizada a transferir tokens da Token Account
- Quantidade: Número de tokens que a Token Account atualmente mantém
Token Account
Os detalhes completos armazenados em cada Token Account incluem o seguinte:
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>,}
Uma carteira precisa de uma token account para cada token (mint) que deseja manter, com o endereço da carteira definido como o proprietário da token account. Cada carteira pode possuir múltiplas token accounts para o mesmo token (mint), mas uma token account só pode ter um proprietário e manter unidades de um token (mint).
Relação de Conta
Observe que os dados de cada Token Account incluem um campo owner
identificando quem tem autoridade sobre a Token Account. Isso difere do
proprietário do programa especificado no tipo base
Account, que é o Token Program para todas as
Token Accounts.
Associated Token Account
Associated Token Accounts simplificam o processo de encontrar o endereço de uma token account para um mint e proprietário específicos. Pense na Associated Token Account como a token account "padrão" para um mint e proprietário específicos.
Uma Associated Token Account é criada com um endereço derivado do endereço do proprietário e do endereço da mint account. É importante entender que uma Associated Token Account é apenas uma token account com um endereço específico.
Isso introduz um conceito-chave no desenvolvimento Solana: Program Derived Address (PDA). Um PDA deriva um endereço deterministicamente usando entradas predefinidas, facilitando a localização do endereço de uma conta.
Associated Token Account
Observe que cada carteira precisa de sua própria token account para manter tokens da mesma mint.
Relacionamento de Contas Expandido
Exemplos de Token CLI
A CLI spl-token
ajuda você a experimentar tokens SPL. Os exemplos abaixo
utilizam o terminal do Solana Playground para executar
comandos CLI diretamente no navegador sem instalação local.
A criação de tokens e contas requer SOL para depósitos de rent de conta e taxas
de transação. Para usuários iniciantes do Solana Playground, crie uma carteira
do Playground e execute o comando solana airdrop
no terminal do
Playground. Você também pode obter SOL da devnet através do
faucet web público.
$solana airdrop 2
Execute spl-token --help
para ver todos os comandos disponíveis.
$spl-token --help
Para instalar a CLI spl-token
localmente, execute:
$cargo install spl-token-cli
Encontre mais exemplos na
documentação do spl-token
.
Os endereços de conta mostrados na saída do seu terminal diferem dos exemplos
abaixo. Use os endereços do seu terminal do Playground ao seguir os exemplos.
Por exemplo, o comando create-token
gera um endereço de mint account com
sua carteira do Playground como autoridade da mint.
Criar um Novo Token
Para criar um novo token (mint account), execute:
$spl-token create-token
A saída se parece com:
Creating token 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgAddress: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgDecimals: 9Signature: 44fvKfT1ezBUwdzrCys3fvCdFxbLMnNvBstds76QZyE6cXag5NupBprSXwxPTzzjrC3cA6nvUZaLFTvmcKyzxrm1
Uma nova mint account começa com fornecimento zero. Verifique o fornecimento atual com:
$spl-token supply <TOKEN_ADDRESS>
O comando supply
para um novo token retorna 0
:
spl-token supply 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Criar uma nova Mint Account requer uma transação com duas instruções. Aqui está um exemplo em Javascript no Solana Playground.
-
O System Program cria uma nova conta com espaço para os dados da Mint Account e transfere a propriedade para o Token Program.
-
O Token Program inicializa os dados da nova conta como uma Mint Account
Criar Token Account
Para manter tokens de uma mint específica, crie uma token account:
$spl-token create-account <TOKEN_ADDRESS>
Exemplo de comando:
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Saída:
Creating account AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2BtrynuCLX9CNofFiaw6Yzbx6hit66pup9Sk7aFjwU2NEbFz7NCHD9w9sWhrCfEd73XveAGK1DxFpJoQZPXU9tS1
O comando create-account
cria uma associated token account com o endereço
da sua carteira como proprietário.
Para criar uma token account com um proprietário diferente:
$spl-token create-account --owner <OWNER_ADDRESS> <TOKEN_ADDRESS>
Nota: <TOKEN_ADDRESS>
especifica a mint account para a token account.
Exemplo de comando:
spl-token create-account --owner 2i3KvjDCZWxBsqcxBHpdEaZYQwQSYE6LXUMx5VjY5XrR 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg
Saída:
Creating account Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 44vqKdfzspT592REDPY4goaRJH3uJ3Ce13G4BCuUHg35dVUbHuGTHvqn4ZjYF9BGe9QrjMfe9GmuLkQhSZCBQuEt
Criar uma Associated Token Account requer uma instrução que invoca o Associated Token Program. Aqui está um exemplo em Javascript no Solana Playground.
O Associated Token Program usa Cross Program Invocations para:
- Invocar o System Program para criar uma nova conta usando o PDA fornecido como endereço
- Invocar o Token Program para inicializar os dados da Token Account
Para criar uma nova Token Account com um novo keypair em vez de um endereço de Associated Token Account, envie uma transação com duas instruções. Aqui está um exemplo em Javascript no Solana Playground.
-
O System Program cria uma nova conta com espaço para os dados da Token Account e transfere a propriedade para o Token Program.
-
O Token Program inicializa os dados como uma Token Account
Cunhar tokens
Para criar novas unidades de um token, cunhe tokens para uma Token Account:
$spl-token mint [OPTIONS] <TOKEN_ADDRESS> <TOKEN_AMOUNT> [--] [RECIPIENT_TOKEN_ACCOUNT_ADDRESS]
Exemplo de comando:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100
Saída:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Signature: 2NJ1m7qCraPSBAVxbr2ssmWZmBU9Jc8pDtJAnyZsZJRcaYCYMqq1oRY1gqA4ddQno3g3xcnny5fzr1dvsnFKMEqG
Para cunhar tokens para uma Token Account diferente:
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Saída:
Minting 100 tokensToken: 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTgRecipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 3SQvNM3o9DsTiLwcEkSPT1Edr14RgE2wC54TEjonEP2swyVCp2jPWYWdD6RwXUGpvDNUkKWzVBZVFShn5yntxVd7
A instrução MintTo
no Token Program cria novos tokens. A autoridade de
cunhagem deve assinar a transação. A instrução cunha tokens para uma Token
Account e aumenta o fornecimento total na Mint Account. Aqui está um exemplo em
Javascript no
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>
Exemplo de comando:
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt
Saída:
Transfer 100 tokensSender: AfB7uwBEsGtrrBqPTVqEgzWed5XdYfM1psPNLmf7EeX9Recipient: Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmtSignature: 5y6HVwV8V2hHGLTVmTmdySRiEUCZnWmkasAvJ7J6m7JR46obbGKCBqUFgLpZu5zQGwM4Xy6GZ4M5LKd1h6Padx3o
A instrução Transfer
no Token Program gerencia transferências de tokens. O
proprietário da Token Account do remetente deve assinar a transação. A instrução
move tokens entre Token Accounts. Aqui está um exemplo em Javascript no
Solana Playground.
Tanto o remetente quanto o destinatário precisam de token accounts para o token específico (mint). O remetente pode incluir instruções para criar a token account do destinatário na mesma transação.
Criar metadados do token
O Token Extensions Program permite armazenar metadados (nome, símbolo, link da imagem) diretamente na Mint Account.
Para criar um token com extensão de metadados:
spl-token create-token --program-id TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb --enable-metadata
Saída:
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 os metadados:
spl-token initialize-metadata <TOKEN_MINT_ADDRESS> <YOUR_TOKEN_NAME> <YOUR_TOKEN_SYMBOL> <YOUR_TOKEN_URI>
O URI do token vincula-se a metadados off-chain. Veja um exemplo de formato JSON aqui.
Exemplo de comando:
spl-token initialize-metadata BdhzpzhTD1MFqBiwNdrRy4jFo2FHFufw3n9e8sVjJczP "TokenName" "TokenSymbol" "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json"
Visualize os metadados no Solana Explorer.
Saiba mais no Guia de Extensão de Metadados. Para detalhes sobre Token Extensions, consulte o Guia de Introdução do Token Extensions e a documentação SPL.
Is this page helpful?