Skip to main content
La méthode RPC getProgramAccounts est un outil puissant pour interroger la blockchain Solana. Elle vous permet de récupérer tous les comptes détenus par un programme on-chain spécifique. Ceci est essentiel pour une large gamme d’applications, allant de la recherche de tous les comptes de jetons associés à un utilisateur pour une émission de jeton particulière, à la découverte de tous les comptes de données spécifiques à un utilisateur pour une application décentralisée. En raison du nombre potentiellement important de comptes qu’un programme peut détenir, getProgramAccounts offre des capacités de filtrage robustes pour vous aider à affiner votre recherche et à récupérer uniquement les données dont vous avez besoin de manière efficace. Pour les applications qui nécessitent d’interroger des ensembles très vastes de comptes de programme, envisagez d’utiliser getProgramAccountsV2 qui fournit une prise en charge de la pagination basée sur un curseur avec des tailles de page configurables jusqu’à 10 000 comptes par requête.

Cas d’Utilisation Courants

  • Trouver Tous les Comptes de Jetons pour une Emission : Découvrez tous les détenteurs d’un jeton SPL spécifique.
  • Récupérer les Données Spécifiques à l’Utilisateur : Récupérez tous les comptes créés par un programme pour un utilisateur particulier (par exemple, les positions d’un utilisateur dans un protocole DeFi, leur état de jeu dans un jeu Play-to-Earn).
  • Lister Toutes les Instances d’un Type de Compte Personnalisé : Si votre programme définit une structure de compte spécifique, getProgramAccounts peut trouver toutes les instances de cette structure.
  • Surveiller l’État du Programme : Observer tous les comptes liés à un programme pour suivre son état général ou son activité.
  • Construire des Outils d’Exploration et d’Analyse : Agréger des données sur les programmes et leurs comptes associés.

Paramètres de Requête

  1. programId (string, requis) :
    • La clé publique encodée en base-58 du programme dont vous souhaitez récupérer les comptes.
    • Exemple : "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" (pour le Programme SPL Token).
  2. options (object, optionnel) : Un objet de configuration avec les champs suivants :
    • commitment (string) : Spécifie le niveau d’engagement (par exemple, "finalized", "confirmed").
    • encoding (string) : Encodage pour le champ data dans chaque compte retourné. Par défaut "base64".
      • "base58" : Alternative plus lente pour les données binaires.
      • "base64" : Encodage standard base64 pour les données binaires.
      • "base64+zstd" : Données binaires encodées en base64, compressées avec zstd.
      • "jsonParsed" : Si le nœud RPC dispose d’un analyseur pour le type de compte du programme (par exemple, SPL Token, Stake), le champ data sera un objet JSON structuré. Cela est fortement recommandé pour la lisibilité et la facilité d’utilisation.
    • filters (array) : Un tableau d’objets de filtre à appliquer aux comptes. Ceci est crucial pour la performance et la pertinence. Vous pouvez utiliser jusqu’à 4 filtres. Les filtres courants incluent :
      • dataSize (object) :
        • dataSize (u64) : Filtre les comptes par leur longueur de données en octets. Exemple : { "dataSize": 165 } (pour les comptes SPL Token).
      • memcmp (object) : Comparaison de la mémoire. Compare une tranche des données du compte avec les octets fournis.
        • offset (usize) : L’offset en octets dans les données du compte à partir duquel commencer la comparaison.
        • bytes (string) : Une chaîne encodée en base-58 des octets à faire correspondre. La chaîne d’octets doit être inférieure à 129 octets.
        • Exemple : Pour trouver les comptes de jetons pour une émission spécifique, vous utiliseriez memcmp avec offset: 0 (où l’adresse de l’émission est stockée dans un compte de jetons) et bytes défini sur la clé publique de l’émission.
    • dataSlice (object) : Ne renvoie qu’une tranche spécifique des données de chaque compte. Utile pour les grands comptes lorsque vous avez besoin uniquement de données partielles.
      • offset (usize) : L’offset en octets à partir duquel commencer la tranche.
      • length (usize) : Le nombre d’octets à renvoyer.
      • Remarque : dataSlice est principalement pour les encodages binaires, pas jsonParsed.
    • withContext (boolean) : Si true, la réponse sera un objet RpcResponse contenant un context (avec slot) et le value (le tableau des comptes). Si false ou omis, il renvoie généralement juste le tableau des comptes. Le comportement peut varier légèrement selon le fournisseur RPC.
    • minContextSlot (u64) : L’emplacement minimal où la requête peut être évaluée.

Structure de la Réponse

La réponse est un tableau d’objets, où chaque objet représente un compte trouvé et inclut :
  • pubkey (string) : La clé publique encodée en base-58 du compte.
  • account (object) :
    • lamports (u64) : Solde du compte en lamports.
    • owner (string) : Clé publique encodée en base-58 du programme qui possède ce compte (ce sera le programId que vous avez interrogé).
    • data (string, array, ou object) : Les données du compte, formatées selon le paramètre encoding.
      • Pour jsonParsed : Un objet JSON représentant l’état désérialisé du compte.
      • Pour base64 : Un tableau ["encoded_string", "base64"].
    • executable (boolean) : Si le compte est exécutable (c’est-à-dire un programme lui-même).
    • rentEpoch (u64) : L’époque à laquelle ce compte devra payer le loyer.
    • space (u64, optionnel) : La longueur des données du compte en octets. Parfois appelé data.length si les données sont un tampon, ou partie de la structure analysée.
Si withContext: true est utilisé, ce tableau sera imbriqué sous le champ value d’un objet RpcResponse.

Exemples

1. Trouver Tous les Comptes de Jetons pour une Emission Spécifique (USDC)

Cet exemple trouve tous les comptes SPL Token qui détiennent des USDC. Il utilise dataSize pour filtrer les comptes de jetons (165 octets) et memcmp pour faire correspondre l’adresse de l’émission USDC à l’offset 0.

2. Trouver Tous les Comptes de Jetons Détenus par un Portefeuille Spécifique

Cet exemple trouve tous les comptes SPL Token détenus par une adresse de portefeuille spécifique. Il utilise dataSize (165 octets) et memcmp à l’offset 32 (où la clé publique du propriétaire est stockée dans un compte de jetons).

Filtrage Avancé

Optimisez vos requêtes avec des filtres pour réduire la taille de la réponse et améliorer la performance :

Référence API

getProgramAccounts

Types de Filtres

  • memcmp : Filtrer les comptes qui correspondent à un modèle spécifique à un offset donné
  • dataSize : Filtrer les comptes par leur taille de données exacte
  • Filtres multiples : Toutes les conditions doivent être satisfaites (ET logique)

Conseils pour les Développeurs

  • Performance : getProgramAccounts peut être intensif en ressources sur les nœuds RPC, surtout sans filtres ou pour les programmes avec de nombreux comptes. Utilisez toujours des filtres (dataSize, memcmp) et dataSlice lorsque possible pour réduire la portée des requêtes et la taille de la réponse.
  • Grands Ensembles de Résultats : Pour les requêtes retournant de nombreux résultats, la réponse pourrait être tronquée ou expirer. Utilisez le filtrage pour réduire la portée, ou envisagez getProgramAccountsV2 pour la prise en charge de la pagination.
  • Limites de Taux : Soyez attentif aux limites de taux des fournisseurs RPC, car les appels fréquents ou lourds à getProgramAccounts peuvent atteindre ces limites.
  • Connaissance de la Disposition des Données : Une utilisation efficace de memcmp nécessite de comprendre la disposition en octets des données de compte que vous interrogez.
  • Disponibilité jsonParsed : L’encodage jsonParsed dépend que le nœud RPC dispose d’un analyseur pour les types de comptes du programme spécifique. Il est largement pris en charge pour les programmes courants comme SPL Token.
getProgramAccounts est une méthode indispensable pour les développeurs ayant besoin d’interroger et d’interagir avec des ensembles de comptes détenus par un programme. Maîtriser ses options de filtrage est la clé pour construire des applications Solana efficaces et robustes.

Pagination pour les Grands Jeux de Données

Pour les applications traitant des programmes qui possèdent un grand nombre de comptes (10 000+), utilisez getProgramAccountsV2 qui fournit :
  • Pagination basée sur un curseur : Définissez limit (1-10,000) et utilisez paginationKey pour naviguer à travers les résultats
  • Mises à jour incrémentales : Utilisez changedSinceSlot pour récupérer uniquement les comptes modifiés depuis un emplacement spécifique
  • Meilleure performance : Empêche les expirations et réduit l’utilisation de la mémoire
  • Comportement de la pagination : La fin de la pagination est uniquement indiquée lorsque aucun compte n’est retourné. Moins de comptes que la limite peuvent être retournés en raison du filtrage - continuez la pagination jusqu’à ce que paginationKey soit nul

Méthodes Connexes

getProgramAccountsV2

Version paginée avec navigation basée sur un curseur pour les grands ensembles de données