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.

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

Os detalhes completos armazenados em cada Mint Account incluem o seguinte:

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>,
}

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 AccountToken Account

Os detalhes completos armazenados em cada Token Account incluem o seguinte:

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>,
}

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 ContaRelaçã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 AccountAssociated Token Account

Observe que cada carteira precisa de sua própria token account para manter tokens da mesma mint.

Relacionamento de Contas ExpandidoRelacionamento 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.

Terminal
$
solana airdrop 2

Execute spl-token --help para ver todos os comandos disponíveis.

Terminal
$
spl-token --help

Para instalar a CLI spl-token localmente, execute:

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

Terminal
$
spl-token create-token

A saída se parece com:

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

Uma nova mint account começa com fornecimento zero. Verifique o fornecimento atual com:

Terminal
$
spl-token supply <TOKEN_ADDRESS>

O comando supply para um novo token retorna 0:

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

  1. O System Program cria uma nova conta com espaço para os dados da Mint Account e transfere a propriedade para o Token Program.

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

Terminal
$
spl-token create-account <TOKEN_ADDRESS>

Exemplo de comando:

Example
spl-token create-account 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg

Saída:

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

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

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

Exemplo de comando:

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

Saída:

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

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.

  1. O System Program cria uma nova conta com espaço para os dados da Token Account e transfere a propriedade para o Token Program.

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

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

Exemplo de comando:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100

Saída:

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

Para cunhar tokens para uma Token Account diferente:

Example
spl-token mint 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 -- Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Saída:

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

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

Exemplo de comando:

Example
spl-token transfer 99zqUzQGohamfYxyo8ykTEbi91iom3CLmwCA75FK5zTg 100 Hmyk3FSw4cfsuAes7sanp2oxSkE9ivaH6pMzDzbacqmt

Saída:

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

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

Saída:

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 os metadados:

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

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

Índice

Editar Página