NOVO: Helius adquire a Light Protocol
Apresentamos: chamadas getProgramAccounts (gPA) mais rápidas
Blog/Atualizações

Apresentamos: chamadas getProgramAccounts (gPA) mais rápidas

Developer Experience Engineer0xIchigo no X0xIchigo no LinkedIn0xIchigo no GitHub
3 min de leitura

As chamadas getProgramAccounts (gPA) são notoriamente problemáticas. Esse método RPC é uma operação cara e ineficiente que consulta um node para buscar todas as contas pertencentes a uma determinada chave pública. Essas chamadas costumam ser lentas e têm limites de taxa bastante restritivos. Às vezes, elas são totalmente bloqueadas (por exemplo, ao fazer uma chamada gPA no programa da Serum), caso os resultados ainda não estejam em cache. Esses problemas forçaram os desenvolvedores a buscar alternativas trabalhosas e menos eficientes. 

Isso muda hoje.

Na Helius, estamos lançando chamadas getProgramAccounts mais rápidas para todos os desenvolvedores da Solana. 

Veja o que mudou:

  • Melhoramos significativamente nossa indexação de contas
  • Você pode esperar que as chamadas gPA sejam de 2 a 10 vezes mais rápidas do que antes, especialmente ao usar filtros em programas maiores
  • Indexamos automaticamente um programa após uma única chamada de qualquer desenvolvedor, melhorando o desempenho para todos

Primeiros passos

Para começar, cadastre-se no Painel do Desenvolvedor da Helius e obtenha uma chave de API na seção “API Keys”. 

Exemplo de getProgramAccounts

Vamos consultar em JavaScript todas as contas pertencentes ao programa Ore V2:

Código
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;

const getProgramAccounts = async () => {
  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "test",
        method: "getProgramAccounts",
        params: [
          "oreV2ZymfyeXgNgBdqMkumTqqAprVqgBWQfoYkrtKWQ",
          {
            "encoding": "base64",
          },

        ],

      })
    });

    const data = await response.json();

    console.log(`All Accounts Owned By The Ore v2 Program: ${JSON.stringify(data, null, 2)}`);
  } catch (error) {
    console.error(error);
  }
};

getProgramAccounts();

Vamos entender como o código funciona:

  1. Configuração da URL: criamos uma URL que aponta para o endpoint RPC da Helius e fornecemos nossa chave de API
  2. Estrutura da solicitação RPC
    • method: “getProgramAccounts” especifica que queremos consultar contas pertencentes ao programa
    • params é um array com dois elementos: o ID do programa que queremos consultar (neste caso, o programa Ore V2) e um objeto de configuração para a consulta
  3. Codificação: solicitamos os dados da conta com codificação base64
  4. Tratamento de erros: tratamos todos os erros gerados com um bloco try/catch

Ao executar esse código, todas as contas pertencentes ao programa Ore V2 serão registradas no console. 

No entanto, esse é um exemplo básico — normalmente, você usará filtros para restringir os resultados e melhorar o desempenho.

Exemplo de getProgramAccounts com filtros

Vamos analisar um exemplo mais prático, no qual consultamos todas as contas de token pertencentes a um endereço específico usando filtros:

Código
const url = `https://mainnet.helius-rpc.com/?api-key=<API_KEY>`;

const getTokenAccounts = async () => {
  try {
    const response = await fetch(url, {
      method: "POST",
      headers: {
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "token-accounts",
        method: "getProgramAccounts",
        params: [
          "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",  // Token Program address
          {
            "encoding": "jsonParsed",  // Get parsed token data
            "filters": [
              {
                "dataSize": 165,  // Size of token account data
              },
              {
                "memcmp": {
                  "offset": 32,  // Location of owner address in the token account
                  "bytes": "YOUR_WALLET_ADDRESS"
                }
              }
            ]
          }
        ]
      })
    });
    const data = await response.json();

    data.result.forEach((account, i) => {
      const parsed = account.account.data.parsed.info;

      console.log(`-- Token Account ${i + 1}: ${account.pubkey} --`);
      console.log(`Mint: ${parsed.mint}`);
      console.log(`Amount: ${parsed.tokenAmount.uiAmount}`);
    });
  } catch (error) {
    console.error("Error fetching token accounts:", error);
  }
};

getTokenAccounts();

Esse exemplo amplia o exemplo básico para demonstrar duas técnicas importantes de filtragem: o uso dos filtros dataSize e memcmp.

dataSize

O filtro dataSize verifica o tamanho exato dos dados de uma determinada conta. Nesse caso, estamos interessados em contas de token, que têm 165 bytes. Isso filtrará imediatamente todas as outras contas pertencentes à carteira fornecida que não sejam contas de token.

Filtro memcmp (comparação de memória)

O filtro memcmp, ou filtro de comparação de memória, permite comparar dados armazenados em um local específico da memória. Usamos um offset para especificar a posição em que a comparação dos dados deve começar. 

Em nosso exemplo, usamos um offset de 32 para ignorar o endereço da mint, armazenado nos primeiros 32 bytes da memória, pois estamos interessados apenas no endereço do proprietário. Esse filtro retornará somente as contas pertencentes ao endereço de carteira especificado.

Ao executar esse código, uma lista de todas as contas de token e seus saldos para o endereço de carteira fornecido será registrada no console. Com a indexação aprimorada da Helius, essas consultas filtradas são significativamente mais rápidas do que as de outros provedores de RPC tradicionais.

Ajuda adicional

Quer ter menos dores de cabeça e fazer chamadas getProgramAccounts mais rápidas? 

Cadastre-se no Painel do Desenvolvedor da Helius e comece hoje mesmo a criar com melhor desempenho. Precisa de ajuda? Acesse o Discord da Helius para tirar dúvidas ou obter suporte!

Se você leu até aqui, valeu, anon! Insira seu endereço de e-mail abaixo para nunca perder uma atualização sobre as novidades da Solana. Está mergulhando nos estudos? Explore os artigos mais recentes em nosso blog e acelere sua jornada na Solana.

Assine a Helius

Acompanhe as novidades mais recentes do desenvolvimento Solana e receba atualizações quando publicarmos