Vue d’ensemble
LaserStream est un service de streaming gRPC Solana géré. Il est compatible avec le protocole ouvert Yellowstone gRPC — donc tout client Yellowstone fonctionne immédiatement — et ajoute des fonctionnalités de production comme la relecture historique, le basculement multi-nœuds, et un environnement entièrement géré. LaserStream utilise le protocole open source gRPC, garantissant aucune dépendance vis-à-vis d’un fournisseur et une compatibilité maximale avec les implémentations gRPC existantes. Vous pouvez vous connecter soit avec le client standard@triton-one/yellowstone-grpc soit utiliser le Helius LaserStream SDK optimisé pour des performances accrues, y compris un débit plus élevé, des reconnexions automatiques, une gestion des abonnements, la gestion des erreurs, et plus encore.
Le SDK LaserStream est 40x plus rapide que les clients JavaScript Yellowstone
Endpoints et Régions
LaserStream est disponible dans plusieurs régions dans le monde. Choisissez le endpoint le plus proche de votre application pour des performances optimales :Endpoints Mainnet
Endpoint Devnet
- Pour les applications de production, choisissez le endpoint mainnet le plus proche de votre serveur pour de meilleures performances (par exemple, si déployé en Europe, utilisez Amsterdam (
ams) ou Francfort (fra)) - Pour tester, utilisez :
https://laserstream-devnet-ewr.helius-rpc.com.
zstd Compression
Tous les endpoints gRPC LaserStream prennent en charge la compression zstd. La compression est facultative : les réponses restent non compressées à moins que votre client ne prenne en charge zstd.
Activez zstd dans le Helius LaserStream TypeScript SDK :
zstd réduit la bande passante réseau, mais ajoute du travail de compression. Évaluez cela avec votre charge de souscription avant de l’activer pour les flux sensibles à la latence.
Troncature des journaux
Par défaut, LaserStream tronque les messages des journaux de transactions à 10 KB pour améliorer la vitesse et la performance. Si vous avez besoin de journaux complets, des endpoints dédiés sans troncature sont disponibles — voir Troncature des journaux.Démarrage rapide
Créer un nouveau projet
Installer les dépendances
tsx car le défaut npx tsc --init sur TypeScript 5.x définit verbatimModuleSyntax, module: "nodenext", et types: [], ce qui casse un rapide ts-node index.ts run. tsx exécute les fichiers .ts sans tsconfig.Obtenir votre clé API
Créer un script de souscription
index.ts avec ce qui suit :Remplacer votre clé API et choisir votre région
index.ts, mettez à jour l’objet config avec :- Votre clé API réelle du Tableau de bord Helius
- Le endpoint LaserStream le plus proche de l’emplacement de votre serveur
- Pour la production (Mainnet) :
- Europe : Utilisez
fra(Francfort),ams(Amsterdam), oulon(Londres) - US Est : Utilisez
ewr(New York) - US Ouest : Utilisez
slc(Salt Lake City) oulax(Los Angeles) - Asie : Utilisez
tyo(Tokyo) ousgp(Singapour)
- Europe : Utilisez
- Pour le développement (Devnet) :
- Utilisez
https://laserstream-devnet-ewr.helius-rpc.com
- Utilisez
Exécuter et voir les résultats
confirmed implique TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, vous verrez les données dans votre console.Flux de travail courants
Guides étape par étape pour les flux de travail que nous voyons le plus souvent. Chaque guide utilise le SDKhelius-laserstream avec reconnexion automatique et relecture historique intégrées.
Abonnements aux comptes
Surveillance des transactions
Surveillance des slots et des blocs
Décodage des données de transaction
transactionUpdate en transactions Solana lisibles.Flux des données AMM Pump
Demande de souscription
Dans la demande de souscription, vous devez inclure les paramètres généraux suivants :fromSlot (un nombre u64) dans l’objet principal SubscribeRequest afin de relire les données à partir d’un slot spécifique. La relecture est actuellement limitée aux dernières ~48 heures (~691 200 slots à la vitesse actuelle du réseau). Notez que les relectures datant de plus de ~20 minutes renvoient uniquement des données finalisées.{ offset: uint64, length: uint64 } qui vous permet de recevoir uniquement les tranches de données requises provenant des comptes.Slots
Slots
mySlotLabel) est un label défini par l’utilisateur pour cette configuration de filtre spécifique, vous permettant de définir potentiellement plusieurs configurations nommées si nécessaire (bien que généralement une seule soit suffisante).Comptes
Comptes
tokenAccounts) est un label défini par l’utilisateur pour cette configuration de filtre spécifique.datasize et/ou memcmp. Pour memcmp, le comparant se trouve sur l’un de bytes, base58, ou base64 directement sur l’objet memcmp.notifyOn n’a aucun effet. Le champ sera supprimé à une date ultérieure.- Les champs fonctionnent comme un ET logique.
- Les valeurs dans les tableaux agissent comme un OU logique (sauf dans
filters, qui fonctionnent comme un ET logique).
Transaction
Transaction
myTxSubscription) est un label défini par l’utilisateur pour cette configuration de filtre spécifique.accountInclude).tokenAccounts facultative (compte de token associé). Lorsqu’elle est définie, un portefeuille accountInclude correspond également aux transactions dans lesquelles il détient un solde de tokens SPL, par exemple les transferts de tokens entrants qui concernent le compte de tokens du portefeuille plutôt que sa clé publique. Accepte "balanceChanged" (correspondances selon la variation du solde), "all" (toute référence, volume plus élevé) ou "none" (aucune extension, valeur par défaut). Le SDK convertit la chaîne en énumération TokenAccountExpansionControlFlag au niveau du protocole (qui fait partie de yellowstone-grpc-proto 12.5.0+). Consultez Filtrage des comptes de tokens (ATA) pour comprendre son fonctionnement.matchMints facultatif (valeur par défaut : false). Lorsque sa valeur est true, les listes accountInclude, accountExclude et accountRequired sont également comparées aux mints figurant dans les soldes de tokens avant et après la transaction, et pas seulement aux clés de ses comptes. Ajoutez un mint à accountInclude pour recevoir toutes les transactions concernant ce token, y compris les simples transferts SPL qui ne font jamais référence au mint dans les clés de leurs comptes. Cette option est facultative et n’a aucun effet sur les filtres existants. Nécessite helius-laserstream 0.8.5+ (JS), 0.6.4+ (Rust) ou go/v0.3.0+ (Go). Consultez Filtrage par mint de token pour connaître la sémantique et voir des exemples.- Les champs fonctionnent comme un ET logique.
- Les valeurs dans les tableaux sont traitées comme un OU logique (sauf pour
accountRequired, où tous doivent correspondre).
Bloc
Bloc
myBlockLabel) est un label défini par l’utilisateur pour cette configuration de filtre spécifique.Méta des Blocs
Méta des Blocs
blockmetadata) est un label défini par l’utilisateur pour cette souscription. Actuellement, aucun filtre n’est disponible pour les métadonnées de bloc — tous les messages sont diffusés par défaut.Entrées
Entrées
entrySubscribe) est un label défini par l’utilisateur pour cette souscription. Actuellement, il n’existe pas de filtres disponibles pour les entrées ; toutes les entrées sont diffusées.Exemples de code (SDK LaserStream)
- Mises à jour de slots
- Mises à jour de comptes
- Mises à jour de transactions
- Blocs
- Métadonnées de blocs
- Entrées
- Unary Methods
Options de SDK
Nous fournissons des SDK officiels pour plusieurs langages de programmation :- TypeScript : SDK TypeScript LaserStream
- Rust : SDK Rust LaserStream
- Go : SDK Go LaserStream
Dépannage / FAQ
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
Q: I'm experiencing lag or slow performance with my LaserStream connection. What could be causing this?
- Lenteur du client JavaScript : le client JavaScript peut prendre du retard lorsqu’il traite trop de messages ou consomme trop de bande passante. Envisagez de filtrer plus précisément vos abonnements afin de réduire le volume de messages, de passer au SDK JavaScript LaserStream ou d’utiliser un autre langage.
- Bande passante locale limitée : les abonnements volumineux peuvent saturer les clients dont la bande passante réseau est limitée. Surveillez votre utilisation du réseau et envisagez d’améliorer votre connexion ou de réduire la portée de l’abonnement.
-
Distance géographique : les longs trajets réseau augmentent la latence et la perte de paquets. Utilisez le point de terminaison le plus proche de votre serveur. Pour les connexions à forte latence, augmentez la taille des tampons de lecture réseau (cela peut multiplier la bande passante par 5 ou plus) :
Pour conserver ces paramètres après les redémarrages, ajoutez-les à
/etc/sysctl.conf:Augmentez à 64 Mo la taille des fenêtres HTTP/2 du flux et de la connexion afin d’éviter les goulots d’étranglement liés au contrôle de flux. Les deux sont nécessaires — augmenter uniquement la fenêtre du flux laisse la fenêtre au niveau de la connexion comme contrainte limitante : - Goulots d’étranglement du traitement côté client : assurez-vous que votre logique de traitement des messages est optimisée et qu’elle ne bloque pas le thread principal pendant de longues périodes.
Q: I'm getting connection errors. What should I check?
Q: I'm getting connection errors. What should I check?
Q: Why aren't my filters working as expected?
Q: Why aren't my filters working as expected?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
Q: Can I subscribe to multiple types of data (e.g., accounts and transactions) in one request?
accounts, transactions) dans le même objet SubscribeRequest.Q: Does LaserStream support consumer groups?
Q: Does LaserStream support consumer groups?
Q: Why are my transaction log messages cut off?
Q: Why are my transaction log messages cut off?
Q: Why am I only receiving Pong responses with no account or slot data?
Q: Why am I only receiving Pong responses with no account or slot data?
ping dans votre objet SubscribeRequest initial amène LaserStream à ignorer silencieusement tous les filtres d’abonnement — seul un Pong est renvoyé, sans aucune donnée de compte, de transaction ou de slot. Pour résoudre ce problème, supprimez ping de la requête d’abonnement initiale, puis envoyez les pings séparément via le récepteur du flux une fois l’abonnement établi. Cela maintient la connexion active sans interférer avec vos filtres.