Lendo da rede
Leia dados da rede Solana buscando diferentes contas. Esta seção va ajudá-lo a entender a estrutura das contas Solana. Cada conta Solana tem um endereço único que é usado para localizar seus dados correspondentes na blockchain. As contas contêm dados de estado ou um programa executável.
Buscar uma conta de carteira
Uma carteira é uma conta pertencente ao System Program. As carteiras são principalmente usadas para armazenar SOL e assinar transações. Quando SOL é enviado para um novo endereço pela primeira vez, uma conta do sistema é automaticamente criada.
O exemplo abaixo gera um novo keypair, solicita SOL para financiar o novo endereço de chave pública e recupera os dados da conta para a carteira recém-financiada.
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));
Quando você busca uma conta de carteira, a resposta inclui os campos mostrados no exemplo de saída à direita.
O campo data contém os dados da conta armazenados como bytes. Para contas de
carteira, este campo está vazio (0 bytes).
O campo executable indica se o campo data da conta contém código de programa
executável. Para contas de carteira, este campo é false.
O campo lamports contém o saldo de SOL da conta, em
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 de rent obsoleto. (Este
campo está incluído para compatibilidade retroativa.)
O campo space mostra o número de bytes contidos 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
O exemplo abaixo busca o Token Program para demonstrar a diferença entre contas de carteira e program accounts. A program account armazena o bytecode compilado para o código-fonte do Token Program. Você pode visualizar esta program account 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 program account executável. Os programas têm os mesmos campos subjacentes que todas as contas, mas com diferenças fundamentais.
{"data": {"type": "Buffer","data": [127, "...truncated, total bytes: 134080...", 0]},"executable": true,"lamports": 4522329612,"owner": "BPFLoader2111111111111111111111111111111111","rentEpoch": 18446744073709552000,"space": 134080}
O campo executable está definido como true, o que indica que o campo data
da conta contém código executável.
O campo data armazena o código executável do programa.
Cada program account é de propriedade do seu
programa carregador. Neste exemplo, o
owner é o programa BPFLoader2.
Buscar uma mint account
Uma mint account é uma conta de propriedade do Token Program que armazena metadados globais para um token específico. Isso inclui o fornecimento total, número de decimais e as contas que estão autorizadas a cunhar ou congelar tokens. O endereço da mint account identifica exclusivamente um token na rede Solana.
O exemplo abaixo busca a mint account do USD Coin para demonstrar como o estado de um programa é armazenado em uma conta separada.
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);
As mint accounts armazenam estado, não código executável. Elas são de propriedade do Token Program, que inclui instruções definindo como criar e atualizar mint accounts.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
O campo data da conta mint armazena estado, não código executável, então o
campo executable é false.
O Token Program define o tipo de dados Mint, que é armazenado no campo data.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
O campo data contém o estado serializado da conta Mint, como a autoridade da
mint, fornecimento total, número de decimais.
Para ler de uma conta Mint, você deve desserializar o campo data no tipo de
dados Mint, que é mostrado no próximo exemplo.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
A conta mint é de propriedade do
Token Program. Isso significa que
seu campo data só pode ser modificado pelas instruções do Token Program.
{"data": {"type": "Buffer","data": [1, "...truncated, total bytes: 82...", 103]},"executable": false,"lamports": 407438077149,"owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA","rentEpoch": 18446744073709552000,"space": 82}
Desserializar conta mint
Antes que os bytes brutos no campo data de uma conta possam ser interpretados
de forma significativa, eles devem ser desserializados. O 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, tornando mais fácil trabalhar com os dados da
conta.
Por exemplo, a biblioteca @solana/spl-token inclui a função
getMint() para ajudar a desserializar o campo data de uma
conta mint no tipo de dados
Mint
definido pelo Token Program.
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 conta Mint.
{"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 campo mintAuthority mostra a única conta que pode criar novas unidades do
token.
O campo supply mostra o número total de tokens que foram mintados. Este valor
é medido 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 conta com autoridade para congelar token
accounts. Um token account congelado não pode transferir ou queimar o token que
contém.
O campo tlvData contém dados extras para Token Extensions e requer
desserialização adicional. Este campo é relevante apenas para contas criadas
pelo Token Extension Program (Token2022).
Is this page helpful?