Lendo da rede

Esta seção explora como ler dados da rede Solana buscando diferentes contas para entender a estrutura de uma conta Solana.

Na Solana, todos os dados existem em "accounts" (contas). Você pode pensar nos dados na Solana como um banco de dados público com uma única tabela "Accounts", onde cada entrada é uma conta com o mesmo tipo base de Account.

Base Account Type
#[derive(PartialEq, Eq, Clone, Default)]
pub struct Account {
/// lamports in the account
pub lamports: u64,
/// data held in this account
#[cfg_attr(feature = "serde", serde(with = "serde_bytes"))]
pub data: Vec<u8>,
/// the program that owns this account. If executable, the program that loads this account.
pub owner: Pubkey,
/// this account's data contains a loaded program (and is now read-only)
pub executable: bool,
/// the epoch at which this account will next owe rent
pub rent_epoch: Epoch,
}

ContasContas

As contas na Solana podem armazenar "estado" ou programas "executáveis". Cada conta tem um "endereço" (chave pública) que serve como seu ID único usado para localizar seus dados correspondentes na blockchain.

As contas Solana contêm:

  • Estado: Dados que devem ser lidos e persistidos. Por exemplo, informações sobre tokens, dados do usuário ou outros dados definidos dentro de um programa.
  • Programas executáveis: Contas contendo o código real dos programas Solana. Essas contas armazenam instruções que os usuários podem invocar.

Esta separação entre código do programa e estado do programa é uma característica fundamental do Modelo de Conta da Solana. Para mais detalhes, consulte a página Modelo de Conta Solana.

Buscar conta de carteira

Este exemplo demonstra como:

  1. Gerar um novo keypair (par de chaves pública/privada).
  2. Solicitar um airdrop de SOL para financiar o novo endereço.
  3. Recuperar os dados da conta para o endereço financiado.

Na Solana, financiar um novo endereço com SOL cria automaticamente uma conta pertencente ao System Program. Todas as contas de "carteira" são simplesmente contas pertencentes ao System Program que mantêm SOL e podem assinar transações.

Fetch Account
import { Keypair, Connection, LAMPORTS_PER_SOL } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`Public Key: ${keypair.publicKey}`);
const connection = new Connection("http://localhost:8899", "confirmed");
// Funding an address with SOL automatically creates an account
const signature = await connection.requestAirdrop(
keypair.publicKey,
LAMPORTS_PER_SOL
);
await connection.confirmTransaction(signature, "confirmed");
const accountInfo = await connection.getAccountInfo(keypair.publicKey);
console.log(JSON.stringify(accountInfo, null, 2));
Console
Click to execute the code.

Uma "carteira" na Solana é uma conta pertencente ao System Program, que é um dos programas integrados da Solana. As contas de carteira são usadas principalmente para armazenar SOL (rastreado no campo lamports) e para assinar transações.

Quando você busca uma conta de carteira, a resposta inclui os campos mostrados no exemplo de saída.

O campo data contém os dados da conta armazenados como bytes.

Para contas de carteira, este campo está vazio (0 bytes). Outras contas usam este campo para armazenar estado do programa ou código de programa executável.

O campo executable indica se o campo data da conta contém código de programa executável.

Para carteiras e contas que armazenam estado do programa, este campo é false.

O campo lamports contém o saldo de SOL da conta, denominado em lamports.

Lamports são a menor unidade de SOL. 1 SOL = 1.000.000.000 lamports.

O campo owner mostra o programa que possui a conta.

Para carteiras, o proprietário é sempre o System Program, com o endereço 11111111111111111111111111111111.

O campo rentEpoch é um campo legado de um mecanismo obsoleto onde as contas eram cobradas "rent" (em lamports) para manter seus dados na rede.

Este campo atualmente não é utilizado, mas está incluído para compatibilidade com versões anteriores.

O campo space mostra o número de bytes no campo data. Este não é um campo no próprio tipo Account, mas está incluído na resposta.

Neste exemplo, o campo space é 0 porque o campo data contém 0 bytes de dados.

Uma "carteira" na Solana é uma conta pertencente ao System Program, que é um dos programas integrados da Solana. As contas de carteira são usadas principalmente para armazenar SOL (rastreado no campo lamports) e para assinar transações.

Quando você busca uma conta de carteira, a resposta inclui os campos mostrados no exemplo de saída.

O campo data contém os dados da conta armazenados como bytes.

Para contas de carteira, este campo está vazio (0 bytes). Outras contas usam este campo para armazenar estado do programa ou código de programa executável.

O campo executable indica se o campo data da conta contém código de programa executável.

Para carteiras e contas que armazenam estado do programa, este campo é false.

O campo lamports contém o saldo de SOL da conta, denominado em lamports.

Lamports são a menor unidade de SOL. 1 SOL = 1.000.000.000 lamports.

O campo owner mostra o programa que possui a conta.

Para carteiras, o proprietário é sempre o System Program, com o endereço 11111111111111111111111111111111.

O campo rentEpoch é um campo legado de um mecanismo obsoleto onde as contas eram cobradas "rent" (em lamports) para manter seus dados na rede.

Este campo atualmente não é utilizado, mas está incluído para compatibilidade com versões anteriores.

O campo space mostra o número de bytes no campo data. Este não é um campo no próprio tipo Account, mas está incluído na resposta.

Neste exemplo, o campo space é 0 porque o campo data contém 0 bytes de dados.

Example Output
{
"data": {
"type": "Buffer",
"data": []
},
"executable": false,
"lamports": 1000000000,
"owner": "11111111111111111111111111111111",
"rentEpoch": 0,
"space": 0
}

Buscar o Token Program

Este exemplo busca o Token Program para demonstrar a diferença entre contas de carteira e contas de programa.

A conta do programa armazena o bytecode compilado para o código-fonte do Token Program. Você pode visualizar esta conta de programa no Solana Explorer.

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

O Token Program é uma conta de programa executável na Solana. Assim como as contas de carteira, os programas têm a mesma estrutura de dados subjacente Account, mas com diferenças fundamentais em seus campos.

O campo executable está definido como true, indicando que o campo data desta conta contém código de programa executável.

Para contas de programa, o campo data armazena o código executável do programa. Em contraste, contas de carteira têm um campo de dados vazio.

Quando você implanta um programa Solana, o código executável do programa é armazenado no campo data de uma conta.

Contas de programa executáveis também têm um programa designado como o owner da conta.

Todas as contas de programa são de propriedade de um programa Loader, que é uma categoria de programas integrados que possuem contas de programa executáveis na Solana.

Para o Token Program, o owner é o programa BPFLoader2.

O Token Program é uma conta de programa executável na Solana. Assim como as contas de carteira, os programas têm a mesma estrutura de dados subjacente Account, mas com diferenças fundamentais em seus campos.

O campo executable está definido como true, indicando que o campo data desta conta contém código de programa executável.

Para contas de programa, o campo data armazena o código executável do programa. Em contraste, contas de carteira têm um campo de dados vazio.

Quando você implanta um programa Solana, o código executável do programa é armazenado no campo data de uma conta.

Contas de programa executáveis também têm um programa designado como o owner da conta.

Todas as contas de programa são de propriedade de um programa Loader, que é uma categoria de programas integrados que possuem contas de programa executáveis na Solana.

Para o Token Program, o owner é o programa BPFLoader2.

Token Program Account
{
"data": {
"type": "Buffer",
"data": [127, "...truncated, total bytes: 134080...", 0]
},
"executable": true,
"lamports": 4522329612,
"owner": "BPFLoader2111111111111111111111111111111111",
"rentEpoch": 18446744073709552000,
"space": 134080
}

Buscar conta Mint

Este exemplo busca a conta Mint do USD Coin (USDC) para mostrar como os programas na Solana armazenam estado em contas separadas.

Uma conta Mint é uma conta de propriedade do Token Program. Ela armazena metadados globais para um token específico, incluindo o fornecimento total, número de decimais e as contas autorizadas a cunhar ou congelar tokens. O endereço da conta Mint identifica exclusivamente um token na rede Solana.

Fetch Program Account
import { Connection, PublicKey } from "@solana/web3.js";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const accountInfo = await connection.getAccountInfo(address);
Console
Click to execute the code.

O ponto chave a observar neste exemplo é que a conta Mint armazena estado, não código executável.

As contas Mint são de propriedade do Token Program, que inclui instruções que definem como criar e atualizar contas Mint.

O campo executable é false porque o campo data da conta mint armazena estado, não código executável.

O Token Program define o tipo de dados Mint, que é armazenado no campo data da conta mint.

O campo data contém o estado serializado da conta Mint, como a autoridade de mint, fornecimento total, número de decimais.

Para ler de uma conta Mint, você deve desserializar o campo data para o tipo de dados Mint. Isso é abordado na próxima etapa.

O Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) é proprietário da conta mint.

Isso significa que o campo data da conta mint só pode ser modificado pelas instruções definidas no Token Program.

O ponto chave a observar neste exemplo é que a conta Mint armazena estado, não código executável.

As contas Mint são de propriedade do Token Program, que inclui instruções que definem como criar e atualizar contas Mint.

O campo executable é false porque o campo data da conta mint armazena estado, não código executável.

O Token Program define o tipo de dados Mint, que é armazenado no campo data da conta mint.

O campo data contém o estado serializado da conta Mint, como a autoridade de mint, fornecimento total, número de decimais.

Para ler de uma conta Mint, você deve desserializar o campo data para o tipo de dados Mint. Isso é abordado na próxima etapa.

O Token Program (TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA) é proprietário da conta mint.

Isso significa que o campo data da conta mint só pode ser modificado pelas instruções definidas no Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Desserializar conta Mint

O campo data de uma conta Solana contém bytes brutos. Para interpretar esses dados de forma significativa, você deve desserializá-los no tipo de dados apropriado definido pelo programa que possui a conta.

A maioria dos programas Solana fornece bibliotecas de cliente com funções auxiliares que abstraem o processo de desserialização. Essas funções convertem os bytes brutos da conta em tipos de dados estruturados, facilitando o trabalho com os dados da conta.

Por exemplo, @solana/spl-token inclui a função getMint() para ajudar a desserializar o campo data de uma conta Mint no tipo de dados Mint.

Deserialize Mint Account Data
import { PublicKey, Connection } from "@solana/web3.js";
import { getMint } from "@solana/spl-token";
const connection = new Connection(
"https://api.mainnet-beta.solana.com",
"confirmed"
);
const address = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
const mintData = await getMint(connection, address, "confirmed");
Console
Click to execute the code.
Mint Account Type
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>,
}

A função getMint() desserializa o campo data de uma conta mint no tipo de dados Mint definido pelo Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Você pode visualizar os dados completamente desserializados da Conta Mint no Solana Explorer.

O campo address contém o endereço da conta Mint.

O endereço da conta mint é usado para identificar o token na rede Solana.

O campo mintAuthority mostra a autoridade permitida para criar novos tokens.

Esta é a única conta que pode criar novas unidades do token.

O campo supply mostra o número total de tokens que foram criados.

Este valor está na menor unidade do token. Para obter o fornecimento total em unidades padrão, ajuste o valor do campo supply pelo decimals.

O campo decimals mostra o número de casas decimais para o token.

O campo isInitialized indica se a conta mint foi inicializada. Este campo é uma verificação de segurança usada no Token Program.

O campo freezeAuthority mostra a autoridade permitida para congelar token accounts.

Uma token account que está congelada não pode transferir ou queimar o token na conta.

O campo tlvData contém dados extras para Token Extensions (requer deserialização adicional).

Este campo é relevante apenas para contas criadas pelo Token Extension Program (Token2022).

A função getMint() desserializa o campo data de uma conta mint no tipo de dados Mint definido pelo Token Program.

Mint Account
{
"data": {
"type": "Buffer",
"data": [1, "...truncated, total bytes: 82...", 103]
},
"executable": false,
"lamports": 407438077149,
"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
"rentEpoch": 18446744073709552000,
"space": 82
}

Você pode visualizar os dados completamente desserializados da Conta Mint no Solana Explorer.

O campo address contém o endereço da conta Mint.

O endereço da conta mint é usado para identificar o token na rede Solana.

O campo mintAuthority mostra a autoridade permitida para criar novos tokens.

Esta é a única conta que pode criar novas unidades do token.

O campo supply mostra o número total de tokens que foram criados.

Este valor está na menor unidade do token. Para obter o fornecimento total em unidades padrão, ajuste o valor do campo supply pelo decimals.

O campo decimals mostra o número de casas decimais para o token.

O campo isInitialized indica se a conta mint foi inicializada. Este campo é uma verificação de segurança usada no Token Program.

O campo freezeAuthority mostra a autoridade permitida para congelar token accounts.

Uma token account que está congelada não pode transferir ou queimar o token na conta.

O campo tlvData contém dados extras para Token Extensions (requer deserialização adicional).

Este campo é relevante apenas para contas criadas pelo Token Extension Program (Token2022).

Deserialized Mint Data
{
"address": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
"mintAuthority": "BJE5MMbqXjVwjAF7oxwPYXnTXDyspzZyt4vwenNw5ruG",
"supply": "8985397351591790",
"decimals": 6,
"isInitialized": true,
"freezeAuthority": "7dGbd2QZcCKcTndnHcTL8q7SMVXAkp688NTQYwrRCrar",
"tlvData": {
"type": "Buffer",
"data": []
}
}

Is this page helpful?

Índice

Editar Página