NUEVO: Helius adquiere Light Protocol
Presentamos: llamadas getProgramAccounts (gPA) más rápidas
Blog/Actualizaciones

Presentamos: llamadas getProgramAccounts (gPA) más rápidas

Developer Experience Engineer0xIchigo en X0xIchigo en LinkedIn0xIchigo en GitHub
3 min de lectura

Las llamadas getProgramAccounts (gPA) tienen fama de estar plagadas de problemas. Este método RPC es una operación costosa e ineficiente que consulta un nodo para obtener todas las cuentas propiedad de una clave pública determinada. Estas llamadas suelen ser lentas y estar sujetas a límites de solicitudes muy estrictos. A veces, incluso se prohíben por completo (por ejemplo, al hacer una llamada gPA al programa de Serum) si los resultados aún no están en caché. Estos problemas han obligado a los desarrolladores a buscar alternativas laboriosas y menos eficientes. 

Eso cambia hoy.

En Helius, presentamos llamadas getProgramAccounts más rápidas para todos los desarrolladores de Solana. 

Estas son las novedades:

  • Mejoramos significativamente la indexación de cuentas
  • Puedes esperar que las llamadas gPA sean entre 2 y 10 veces más rápidas que antes, especialmente al usar filtros con programas más grandes
  • Indexamos automáticamente un programa después de una sola llamada de cualquier desarrollador, lo que mejora el rendimiento para todos

Primeros pasos

Para comenzar, regístrate en el panel para desarrolladores de Helius y obtén una clave de API en la sección “Claves de API”. 

Ejemplo de getProgramAccounts

Consultemos todas las cuentas propiedad del programa Ore V2 en JavaScript:

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();

Veamos cómo funciona el código:

  1. Configuración de la URL: Creamos una URL que apunta al endpoint RPC de Helius y proporcionamos nuestra clave de API
  2. Estructura de la solicitud RPC
    • method: “getProgramAccounts” especifica que queremos consultar las cuentas propiedad del programa
    • params es un arreglo que contiene dos elementos: el ID del programa que queremos consultar (en este caso, el programa Ore V2) y un objeto de configuración para la consulta
  3. Codificación: Solicitamos los datos de la cuenta con codificación base64
  4. Manejo de errores: Manejamos cualquier error generado mediante un bloque try/catch

Al ejecutar este código, se mostrarán en la consola todas las cuentas propiedad del programa Ore V2. 

Sin embargo, este es un ejemplo básico. Por lo general, querrás usar filtros para acotar los resultados y mejorar el rendimiento.

Ejemplo de getProgramAccounts con filtros

Veamos un ejemplo más práctico en el que consultamos, mediante filtros, todas las cuentas de tokens propiedad de una dirección específica:

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();

Este ejemplo amplía el ejemplo básico para demostrar dos técnicas de filtrado importantes: usar un filtro dataSize y uno memcmp.

dataSize

El filtro dataSize comprueba el tamaño exacto de los datos de una cuenta determinada. En nuestro caso, nos interesan las cuentas de tokens, que ocupan 165 bytes. Esto descarta de inmediato cualquier otra cuenta propiedad de la cartera proporcionada que no sea una cuenta de tokens.

Filtro memcmp (comparación de memoria)

El filtro memcmp, o filtro de comparación de memoria, nos permite comparar los datos almacenados en una ubicación específica de la memoria. Usamos un desplazamiento para indicar la posición en la que debe comenzar la comparación de datos. 

En nuestro ejemplo, usamos un desplazamiento de 32 para omitir la dirección del mint, almacenada en los primeros 32 bytes de memoria, ya que solo nos interesa la dirección del propietario. Este filtro solo devolverá las cuentas propiedad de la dirección de cartera especificada.

Al ejecutar este código, se mostrará en la consola una lista de todas las cuentas de tokens y sus saldos para la dirección de cartera proporcionada. Gracias a la indexación mejorada de Helius, estas consultas filtradas son significativamente más rápidas que las de otros proveedores RPC tradicionales.

Ayuda adicional

¿Todo listo para sufrir menos dolores de cabeza y disfrutar de llamadas getProgramAccounts más rápidas? 

Regístrate hoy en el panel para desarrolladores de Helius y comienza a desarrollar con un mejor rendimiento. ¿Necesitas ayuda? Visita el Discord de Helius si tienes preguntas o necesitas soporte.

Si llegaste hasta aquí, ¡gracias, anon! Asegúrate de ingresar tu correo electrónico a continuación para no perderte ninguna novedad de Solana. ¿Estás en una racha de aprendizaje? Explora los artículos más recientes de nuestro blog y acelera tu recorrido por Solana.

Suscríbete a Helius

Mantente al día con las novedades del desarrollo en Solana y recibe actualizaciones cuando publiquemos