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.
#[derive(PartialEq, Eq, Clone, Default)]pub struct Account {/// lamports in the accountpub 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 rentpub rent_epoch: Epoch,}
Contas
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:
- Gerar um novo keypair (par de chaves pública/privada).
- Solicitar um airdrop de SOL para financiar o novo endereço.
- 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.
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 accountconst 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));
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.
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.
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);
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.
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.
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);
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.
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.
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");
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>,}
A função getMint()
desserializa o campo data
de uma conta mint no tipo
de dados
Mint
definido pelo Token Program.
{"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).
Is this page helpful?