NOUVEAU : Helius acquiert Light Protocol
Présentation : des appels getProgramAccounts (gPA) plus rapides
Blog/Actualités

Présentation : des appels getProgramAccounts (gPA) plus rapides

Developer Experience Engineer0xIchigo sur X0xIchigo sur LinkedIn0xIchigo sur GitHub
3 min de lecture

Les appels getProgramAccounts (gPA) sont connus pour leurs nombreux problèmes. Cette méthode RPC est une opération coûteuse et inefficace qui interroge un nœud afin de récupérer tous les comptes détenus par une clé publique donnée. Ces appels sont souvent lents et soumis à des limites de débit strictes. Ils sont parfois même entièrement interdits (par exemple, lors d’un appel gPA sur le programme de Serum) si les résultats ne sont pas déjà mis en cache. Ces problèmes ont contraint les développeurs à chercher des solutions alternatives fastidieuses et moins efficaces. 

Cela change dès aujourd’hui.

Chez Helius, nous proposons des appels getProgramAccounts plus rapides à tous les développeurs Solana. 

Voici les nouveautés :

  • Nous avons considérablement amélioré l’indexation de nos comptes
  • Les appels gPA sont désormais 2 à 10 fois plus rapides, en particulier lorsque vous utilisez des filtres pour les programmes volumineux
  • Nous indexons automatiquement un programme après un seul appel effectué par n’importe quel développeur, ce qui améliore les performances pour tous

Premiers pas

Pour commencer, inscrivez-vous sur le tableau de bord développeur Helius et obtenez une clé API dans la section « API Keys ». 

Exemple avec getProgramAccounts

Interrogeons tous les comptes détenus par le programme Ore V2 en JavaScript :

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

Voyons en détail le fonctionnement du code :

  1. Configuration de l’URL : nous créons une URL qui pointe vers le point de terminaison RPC de Helius et lui transmettons notre clé API
  2. Structure de la requête RPC
    • method: “getProgramAccounts” indique que nous souhaitons interroger les comptes détenus par un programme
    • params est un tableau contenant deux éléments : l’ID du programme que nous souhaitons interroger (ici, le programme Ore V2) et un objet de configuration pour la requête
  3. Encodage : nous demandons les données du compte avec un encodage base64
  4. Gestion des erreurs : nous traitons toutes les erreurs générées à l’aide d’un bloc try/catch

L’exécution de ce code affichera dans la console tous les comptes détenus par le programme Ore V2. 

Il s’agit toutefois d’un exemple élémentaire : dans la plupart des cas, vous utiliserez des filtres pour affiner les résultats et améliorer les performances.

Exemple avec getProgramAccounts et des filtres

Examinons un exemple plus concret dans lequel nous utilisons des filtres pour interroger tous les comptes de tokens détenus par une adresse donnée :

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

Cet exemple s’appuie sur l’exemple élémentaire pour illustrer deux techniques de filtrage importantes : l’utilisation d’un filtre dataSize et d’un filtre memcmp.

dataSize

Le filtre dataSize vérifie la taille exacte des données d’un compte donné. Dans notre cas, nous nous intéressons aux comptes de tokens, dont la taille est de 165 octets. Cela élimine immédiatement tous les autres comptes détenus par le portefeuille fourni qui ne sont pas des comptes de tokens.

Filtre memcmp (comparaison de mémoire)

Le filtre memcmp, ou filtre de comparaison de mémoire, nous permet de comparer les données stockées à un emplacement précis de la mémoire. Nous utilisons un décalage pour indiquer la position à partir de laquelle comparer les données. 

Dans notre exemple, nous utilisons un décalage de 32 pour ignorer l’adresse de mint, stockée dans les 32 premiers octets de la mémoire, car seule l’adresse du propriétaire nous intéresse. Ce filtre renverra uniquement les comptes détenus par l’adresse de portefeuille indiquée.

L’exécution de ce code affichera dans la console la liste de tous les comptes de tokens et leurs soldes pour l’adresse de portefeuille fournie. Grâce à l’indexation améliorée de Helius, ces requêtes filtrées sont nettement plus rapides que celles des autres fournisseurs RPC traditionnels.

Aide supplémentaire

Prêt à réduire les complications et à profiter d’appels getProgramAccounts plus rapides ? 

Inscrivez-vous sur le tableau de bord développeur Helius et commencez dès aujourd’hui à développer avec de meilleures performances. Besoin d’aide ? Rejoignez le Discord de Helius pour poser vos questions ou obtenir de l’aide !

Si vous avez lu jusqu’ici, merci, anon ! Saisissez votre adresse e-mail ci-dessous pour ne jamais manquer les dernières nouveautés de Solana. Vous avez soif d’apprendre ? Découvrez les derniers articles de notre blog et accélérez votre parcours sur Solana.

Abonnez-vous à Helius

Suivez les dernières actualités du développement sur Solana et recevez une notification à chaque publication