Retour aux questions fréquentes

Comment obtenir toutes les transactions d'un programme Solana ?

Mis à jour en août 2026

Pour un programme à faible volume, paginez getSignaturesForAddress et récupérez chaque transaction. Pour un programme très actif, cette approche n'aboutira pas — vous devez plutôt traiter les blocs et filtrer par ID de programme, ce que fait un pipeline d'indexation.

Il y a aussi un piège de correction dans l'approche RPC qui surprend souvent, décrit plus bas.

Pourquoi l'approche RPC s'effondre-t-elle ?

La pagination est séquentielle. getSignaturesForAddress renvoie jusqu'à 1 000 signatures par appel. Un programme avec des millions de transactions signifie des milliers d'appels séquentiels, chacun suivi de la récupération des transactions elles-mêmes. Cela ne se parallélise pas bien et prend très longtemps.

Limites de débit. Les fournisseurs limitent rapidement ce type de pattern, car il est coûteux à servir.

L'historique peut ne plus être là. Les nœuds RPC standards font de l'élagage (pruning). Les transactions anciennes peuvent être indisponibles quelle que soit la patience avec laquelle vous paginez.

Les invocations inter-programmes sont manquées. C'est le problème de correction. Si votre programme est invoqué par un autre programme — un routeur, un agrégateur, un wrapper — la transaction peut ne pas être attribuée à l'adresse de votre programme comme vous l'attendez. Une énumération naïve des signatures manque une activité qui a pourtant réellement impliqué votre programme.

À quoi ressemble l'approche complète ?

Traiter directement les blocs et filtrer par ID de programme, y compris les instructions internes.

Un module Substreams reçoit chaque bloc Solana, examine les instructions de chaque transaction — de premier niveau et internes — et émet des enregistrements où votre programme apparaît. Comme les segments historiques sont traités en parallèle, l'historique complet d'un programme est borné par le débit de parallélisation plutôt que par une pagination séquentielle.

Le même module continue ensuite sur les blocs en direct, vous n'avez donc pas à construire un chemin temps réel séparé.

Pagination RPCTraitement par bloc
Historique completLimité par l'élagageComplet, depuis la genèse
VitesseSéquentielleParallèle
Instructions internesManquéesIncluses
Limites de débitOuiNon
DécodageÀ votre chargeDans le module

À quoi devrait ressembler la sortie ?

Décidez la forme avant de lancer un gros backfill, car relancer pour ajouter un champ est un travail évitable.

La plupart des équipes veulent : signature, slot, horodatage du bloc, l'instruction exécutée, les arguments décodés, les comptes impliqués, et le succès ou l'échec. Conservez toujours le slot et la signature sur chaque ligne — vous en avez besoin pour la déduplication et pour raisonner sur les reorgs.

Si le programme est basé sur Anchor, son IDL vous donne les noms d'instructions et les types d'arguments. S'il n'y a pas d'IDL, le discriminateur peut être dérivé du code source Rust du programme — une approche que gèrent les agent skills, et qui a été vérifiée dans une évaluation publiée.

Comment vérifier que j'ai tout ?

Choisissez une plage de slots, extrayez-la, et comparez-la à un explorateur de blocs sur la même plage. Cherchez spécifiquement les transactions où votre programme a été invoqué par un autre programme — c'est là que l'approche RPC et l'approche complète divergent, et où se cacherait sinon un trou silencieux.


Questions fréquentes

getSignaturesForAddress est-il parfois le bon outil ? Oui, pour les programmes à faible volume, l'activité récente, ou une exploration rapide.

Comment obtenir des transactions antérieures à la fenêtre d'élagage de mon nœud RPC ? Utilisez une source qui sert l'historique complet plutôt qu'un nœud RPC standard.

Ai-je besoin de l'IDL ? Cela rend le décodage direct. Sans IDL, le discriminateur peut être dérivé du code source.


Obtenez une clé API sur thegraph.market — aucune information personnelle requise.

Voir aussi : Jusqu'où Yellowstone gRPC peut-il rejouer les données Solana ? · Comment remplir un historique de données blockchain (backfill) ?