getProgramAccounts é uma ferramenta poderosa para consultar a blockchain Solana. Ele permite que você recupere todas as contas que são de propriedade de um programa específico on-chain. Isso é essencial para uma ampla gama de aplicações, desde encontrar todas as contas de token associadas a um usuário para um determinado token mint até descobrir todas as contas de dados específicas do usuário para uma aplicação descentralizada.
Devido ao potencialmente grande número de contas que um programa pode possuir, getProgramAccounts fornece capacidades robustas de filtragem para ajudar a restringir sua busca e recuperar apenas os dados que você precisa de forma eficiente.
Para aplicações que precisam consultar conjuntos muito grandes de contas de programa, considere usar getProgramAccountsV2 que fornece suporte a paginação baseada em cursor com tamanhos de página configuráveis de até 10.000 contas por solicitação.
Casos de Uso Comuns
- Encontrar Todas as Contas de Token para um Mint: Descubra todos os detentores de um token SPL específico.
- Recuperando Dados Específicos do Usuário: Busque todas as contas criadas por um programa para um usuário específico (por exemplo, as posições de um usuário em um protocolo DeFi, seu estado de jogo em um jogo Play-to-Earn).
- Listando Todas as Instâncias de um Tipo de Conta Personalizado: Se seu programa define uma estrutura específica de conta,
getProgramAccountspode encontrar todas as instâncias dessa estrutura. - Monitoramento do Estado do Programa: Observando todas as contas relacionadas a um programa para rastrear seu estado ou atividade geral.
- Construindo Exploradores e Ferramentas de Análise: Agregando dados sobre programas e suas contas associadas.
Parâmetros de Solicitação
-
programId(string, obrigatório):- A chave pública codificada em base-58 do programa cujas contas você deseja buscar.
- Exemplo:
"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"(para o Programa de Token SPL).
-
options(object, opcional): Um objeto de configuração com os seguintes campos:commitment(string): Especifica o nível de compromisso (por exemplo,"finalized","confirmed").encoding(string): Codificação para o campodatadentro de cada conta retornada. O padrão é"base64"."base58": Alternativa mais lenta para dados binários."base64": Codificação padrão base64 para dados binários."base64+zstd": Dados binários codificados em Base64 e comprimidos por zstd."jsonParsed": Se o nó RPC tiver um parser para o tipo de conta do programa (por exemplo, SPL Token, Stake), o campodataserá um objeto JSON estruturado. Altamente recomendado para legibilidade e facilidade de uso.
filters(array): Uma matriz de objetos de filtro para aplicar às contas. Isto é crucial para desempenho e relevância. Você pode usar até 4 filtros. Filtros comuns incluem:dataSize(object):dataSize(u64): Filtra contas pelo comprimento de seus dados em bytes. Exemplo:{ "dataSize": 165 }(para contas de Token SPL).
memcmp(object): Comparação de memória. Compara uma fatia dos dados da conta com os bytes fornecidos.offset(usize): O deslocamento em bytes nos dados da conta onde começar a comparação.bytes(string): Uma string codificada em base-58 dos bytes a serem correspondidos. A string de bytes deve ter menos de 129 bytes.- Exemplo: Para encontrar contas de token para um mint específico, você usaria
memcmpcomoffset: 0(onde o endereço do mint é armazenado em uma conta de token) ebytesdefinido para a chave pública do mint.
dataSlice(object): Retorna apenas uma fatia específica dos dados de cada conta. Útil para contas grandes quando você só precisa de dados parciais.offset(usize): O deslocamento em bytes de onde começar a fatia.length(usize): O número de bytes a serem retornados.- Nota:
dataSliceé principalmente para codificações binárias, nãojsonParsed.
withContext(boolean): Setrue, a resposta será um objetoRpcResponsecontendo umcontext(comslot) e ovalue(o array de contas). Sefalseou omitido, normalmente retorna apenas o array de contas. O comportamento pode variar ligeiramente por provedor de RPC.minContextSlot(u64): O slot mínimo em que a solicitação pode ser avaliada.
Estrutura de Resposta
A resposta é uma matriz de objetos, onde cada objeto representa uma conta encontrada e inclui:pubkey(string): A chave pública codificada em base-58 da conta.account(object):lamports(u64): Saldo da conta em lamports.owner(string): Chave pública codificada em base-58 do programa que possui esta conta (esta será aprogramIdque você consultou).data(string,array, ouobject): Os dados da conta, formatados de acordo com o parâmetroencoding.- Para
jsonParsed: Um objeto JSON representando o estado desserializado da conta. - Para
base64: Um array["encoded_string", "base64"].
- Para
executable(boolean): Se a conta é executável (ou seja, um programa em si).rentEpoch(u64): A época em que esta conta deverá pagar o aluguel novamente.space(u64, opcional): O comprimento dos dados da conta em bytes. Às vezes referido comodata.lengthse os dados forem um buffer, ou parte da estrutura analisada.
withContext: true for usado, esta matriz será aninhada sob o campo value de um objeto RpcResponse.
Exemplos
1. Encontrar Todas as Contas de Token para um Mint Específico (USDC)
Este exemplo encontra todas as contas de Token SPL que possuem USDC. Ele usadataSize para filtrar contas de token (165 bytes) e memcmp para corresponder ao endereço do mint USDC no deslocamento 0.
2. Encontrar Todas as Contas de Token Possuídas por uma Carteira Específica
Este exemplo encontra todas as contas de Token SPL possuídas por um endereço de carteira específico. Ele usadataSize (165 bytes) e memcmp no deslocamento 32 (onde o pubkey do proprietário é armazenado em uma conta de token).
Filtragem Avançada
Otimize suas consultas com filtros para reduzir o tamanho da resposta e melhorar o desempenho:API Reference
getProgramAccounts
Tipos de Filtro
memcmp: Filtre contas que correspondem a um padrão específico em um deslocamento dadodataSize: Filtre contas por seu tamanho de dados exato- Múltiplos filtros: Todas as condições devem ser satisfeitas (AND lógico)
Dicas para Desenvolvedores
- Desempenho:
getProgramAccountspode ser intensivo em recursos nos nós RPC, especialmente sem filtros ou para programas com muitas contas. Sempre use filtros (dataSize,memcmp) edataSliceonde possível para reduzir o escopo da consulta e o tamanho da resposta. - Conjuntos de Resultados Grandes: Para consultas que retornam muitos resultados, a resposta pode ser truncada ou sofrer um timeout. Use filtragem para reduzir o escopo ou considere
getProgramAccountsV2para suporte a paginação. - Limites de Taxa: Fique atento aos limites de taxa do provedor RPC, já que chamadas frequentes ou pesadas de
getProgramAccountspodem atingir esses limites. - Conhecimento do Layout dos Dados: Uso eficaz de
memcmprequer entendimento do layout de bytes dos dados da conta que você está consultando. - Disponibilidade
jsonParsed: A codificaçãojsonParseddepende de o nó RPC ter um parser para os tipos de conta do programa específico. É amplamente suportado para programas comuns como SPL Token.
getProgramAccounts é um método indispensável para desenvolvedores que precisam consultar e interagir com conjuntos de contas de propriedade de um programa. Dominar suas opções de filtragem é chave para construir aplicações Solana eficientes e robustas.
Paginação para Conjuntos de Dados Grandes
Para aplicações lidando com programas que possuem um grande número de contas (10.000+), usegetProgramAccountsV2 que fornece:
- Paginação baseada em cursor: Defina
limit(1-10.000) e usepaginationKeypara navegar pelos resultados - Atualizações incrementais: Use
changedSinceSlotpara buscar apenas contas modificadas desde um slot específico - Melhor desempenho: Evita timeouts e reduz o uso de memória
- Comportamento de paginação: Fim da paginação só é indicado quando nenhuma conta é retornada. Menos contas que o limite podem ser retornadas devido à filtragem - continue a paginação até
paginationKeyser nulo
Métodos Relacionados
getProgramAccountsV2
Versão paginada com navegação baseada em cursor para conjuntos de dados grandes