Skip to main content

Descripción general

LaserStream es un servicio administrado de streaming gRPC de Solana. Es compatible a nivel de protocolo con el protocolo abierto Yellowstone gRPC, por lo que cualquier cliente de Yellowstone funciona sin configuración adicional. Además, incorpora funciones para producción, como reproducción histórica, conmutación por error entre varios nodos y un entorno completamente administrado. LaserStream usa el protocolo gRPC de código abierto, lo que evita la dependencia de un proveedor y garantiza la máxima compatibilidad con las implementaciones de gRPC existentes. Puedes conectarte con el cliente @triton-one/yellowstone-grpc estándar o usar el SDK de Helius LaserStream optimizado para el rendimiento. Este ofrece ventajas adicionales, como mayor rendimiento, reconexiones automáticas, administración de suscripciones, gestión de errores y más.

LaserStream SDK is 40x Faster vs. JavaScript Yellowstone Clients

Descubre cómo usamos Rust Core con enlaces NAPI sin copias para maximizar el rendimiento del SDK de JavaScript
Aviso de rendimiento: Si experimentas retrasos o problemas de rendimiento con tu conexión de LaserStream, consulta la sección de solución de problemas para conocer las causas y soluciones comunes.

Endpoints y regiones

LaserStream está disponible en varias regiones de todo el mundo. Elige el endpoint más cercano a tu aplicación para obtener un rendimiento óptimo:

Endpoints de Mainnet

Endpoint de Devnet

Selección de red y región:
  • Para aplicaciones de producción, elige el endpoint de Mainnet más cercano a tu servidor para obtener el mejor rendimiento (por ejemplo, si implementas en Europa, usa Ámsterdam (ams) o Fráncfort (fra))
  • Para pruebas, usa: https://laserstream-devnet-ewr.helius-rpc.com.

Compresión zstd

Todos los endpoints de LaserStream gRPC admiten la compresión zstd. La compresión es opcional: las respuestas permanecen sin comprimir a menos que tu cliente anuncie compatibilidad con zstd. Habilita zstd en el SDK de TypeScript de Helius LaserStream:
zstd reduce el ancho de banda de red, pero agrega trabajo de compresión. Evalúa su rendimiento con la carga de trabajo de tu suscripción antes de habilitarlo en streams sensibles a la latencia.

Truncamiento de registros

De forma predeterminada, LaserStream trunca los mensajes de registro de transacciones a 10 KB para mejorar la velocidad y el rendimiento. Si necesitas los registros completos, hay endpoints dedicados sin truncamiento. Consulta Truncamiento de registros.

Inicio rápido

Comienza a usar LaserStream desde tu panel de Helius. Mainnet requiere un plan Business o Professional; Devnet está disponible en el plan Developer y superiores. Consulta Planes y precios para obtener más información.
1

Create a New Project

2

Install Dependencies

Usamos tsx porque el npx tsc --init predeterminado de TypeScript 5.x establece verbatimModuleSyntax, module: "nodenext" y types: [], que impiden una ejecución rápida de ts-node index.ts. tsx ejecuta archivos .ts sin un tsconfig.
3

Obtain Your API Key

Genera una clave desde el panel de Helius.Esta clave servirá como tu token de autenticación para LaserStream.
Requisitos del plan: LaserStream Devnet está disponible en todos los planes. LaserStream Mainnet requiere un plan Business o Professional.
4

Create a Subscription Script

Crea index.ts con lo siguiente:
5

Replace Your API Key and Choose Your Region

En index.ts, actualiza el objeto config con:
  1. Tu clave de API real del panel de Helius
  2. El endpoint de LaserStream más cercano a la ubicación de tu servidor
Ejemplos de selección de red y región:
  • Para producción (Mainnet):
    • Europa: usa fra (Fráncfort), ams (Ámsterdam) o lon (Londres)
    • Este de EE. UU.: usa ewr (Nueva York)
    • Oeste de EE. UU.: usa slc (Salt Lake City) o lax (Los Ángeles)
    • Asia: usa tyo (Tokio) o sgp (Singapur)
  • Para desarrollo (Devnet):
    • Usa https://laserstream-devnet-ewr.helius-rpc.com
6

Run and View Results

Cada vez que una transacción del token confirmed involucre a TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, verás los datos en tu consola.

Flujos de trabajo comunes

Guías paso a paso para los flujos de trabajo que vemos con mayor frecuencia. Cada guía usa el SDK helius-laserstream, con reconexión automática y reproducción histórica integradas.

Account Subscriptions

Supervisa los cambios de saldo, datos y propiedad de cuentas específicas mediante filtros.

Transaction Monitoring

Transmite transacciones que involucren cuentas objetivo y filtra por programa, voto o estado de error.

Slot & Block Monitoring

Realiza un seguimiento del consenso de la red, la producción de bloques y las transiciones del nivel de confirmación.

Decoding Transaction Data

Analiza las cargas útiles binarias transactionUpdate y conviértelas en transacciones de Solana legibles.

Stream Pump AMM Data

Ejemplo real: supervisa operaciones de Pump AMM con filtros resistentes a las reconexiones.
El cliente @triton-one/yellowstone-grpc funciona con los mismos endpoints si prefieres el protocolo Yellowstone sin abstracciones. Consulta la referencia de Yellowstone gRPC para obtener detalles a nivel de protocolo.

Solicitud de suscripción

En la solicitud de suscripción, debes incluir los siguientes parámetros generales:
Reproducción histórica: Puedes incluir opcionalmente un campo fromSlot (un número u64) en el objeto SubscribeRequest principal para reproducir datos a partir de un slot específico. Actualmente, la reproducción se limita a los últimos 216 000 slots (≈24 horas). Ten en cuenta que las reproducciones con más de ~20 minutos de antigüedad solo devuelven datos finalizados.
enum
Especifica el nivel de confirmación, que puede ser processed, confirmed o finalized.
array
Un arreglo de objetos { offset: uint64, length: uint64 } que te permite recibir únicamente las secciones de datos necesarias de las cuentas.
boolean
Algunos proveedores de nube, como Cloudflare, pueden cerrar los streams inactivos después de un periodo sin actividad. Para evitarlo y mantener activa la conexión sin tener que reenviar los filtros, establece este valor en true. El servidor responderá con un mensaje Pong cada 15 segundos.
A continuación, debes especificar los filtros de los datos a los que quieres suscribirte, como cuentas, bloques, slots o transacciones.
Define filtros para las actualizaciones de slots. La clave que uses (por ejemplo, mySlotLabel) es una etiqueta definida por ti para esta configuración de filtro específica. Esto te permite definir varias configuraciones con nombre si es necesario, aunque normalmente basta con una.
boolean
De forma predeterminada, se envían slots para todos los niveles de confirmación. Con este filtro, puedes elegir recibir solo el nivel de confirmación seleccionado.
boolean
Permite que la suscripción reciba actualizaciones sobre cambios dentro de un slot, no solo al comienzo de nuevos slots. Esto resulta útil para obtener datos de slots más detallados y con baja latencia.
Define filtros para las actualizaciones de datos de cuentas. La clave que uses (por ejemplo, tokenAccounts) es una etiqueta definida por ti para esta configuración de filtro específica.
array
Coincide con cualquier clave pública del arreglo proporcionado.
array
La clave pública del propietario de la cuenta. Coincide con cualquier clave pública del arreglo proporcionado.
array
Es similar a los filtros de getProgramAccounts. Es un arreglo de filtros datasize o memcmp, o de ambos. Para memcmp, el valor de comparación se coloca en bytes, base58 o base64 directamente en el objeto memcmp.
enum
obsoleto
Obsoleto: no tiene efecto desde Agave 4.2. Establecer notifyOn no produce ningún efecto. El campo se eliminará más adelante.
Si todos los campos están vacíos, se transmiten todas las cuentas. De lo contrario:
  • Los campos operan como un AND lógico.
  • Los valores dentro de los arreglos operan como un OR lógico (excepto dentro de filters, donde operan como un AND lógico).
¿Realizas un seguimiento de más de ~10 000 cuentas? En lugar de una lista explícita de claves públicas (32 bytes por cuenta), usa un filtro cuckoo comprimido (~3–4 bytes por cuenta) para suscribirte a cientos de miles de cuentas en un solo stream. Está disponible en los SDK de Rust y JavaScript.
Define filtros para las actualizaciones de transacciones. La clave que uses (por ejemplo, myTxSubscription) es una etiqueta definida por ti para esta configuración de filtro específica.
boolean
Habilita o deshabilita la transmisión de transacciones de voto.
boolean
Habilita o deshabilita la transmisión de transacciones fallidas.
string
Transmite únicamente las transacciones que coincidan con la firma especificada.
array
Filtra las transacciones que involucren cualquier cuenta de la lista proporcionada.
array
Excluye las transacciones que involucren cualquier cuenta de la lista proporcionada (lo contrario de accountInclude).
array
Filtra las transacciones que involucren todas las cuentas de la lista proporcionada (deben usarse todas las cuentas).
string
Expansión opcional de tokenAccounts (cuenta de token asociada). Cuando se establece, una cartera accountInclude también coincide con las transacciones donde posee un saldo de tokens SPL; por ejemplo, transferencias de tokens entrantes que interactúan con la cuenta de tokens de la cartera en lugar de su clave pública. Acepta "balanceChanged" (coincidencias por diferencia de saldo), "all" (cualquier referencia, mayor volumen) o "none" (sin expansión, el valor predeterminado). El SDK convierte la cadena al enum TokenAccountExpansionControlFlag del nivel de protocolo (parte de yellowstone-grpc-proto 12.5.0+). Consulta Filtrado de cuentas de tokens (ATA) para saber qué hace y cómo funciona.
boolean
Indicador matchMints opcional (valor predeterminado: false). Cuando es true, las listas accountInclude, accountExclude e accountRequired también se comparan con los mints de los saldos de tokens anteriores y posteriores a la transacción, no solo con sus claves de cuenta. Coloca un mint en accountInclude para recibir todas las transacciones que interactúen con ese token, incluidas las transferencias SPL simples que nunca hagan referencia al mint en sus claves de cuenta. Es opcional y no afecta a los filtros existentes. Requiere helius-laserstream 0.8.5+ (JS), 0.6.4+ (Rust) o go/v0.3.0+ (Go). Consulta Filtrado por mint de token para conocer la semántica y ver ejemplos.
Si todos los campos quedan vacíos, se transmiten todas las transacciones. De lo contrario:
  • Los campos operan como un AND lógico.
  • Los valores dentro de los arreglos se tratan como un OR lógico (excepto en accountRequired, donde todos deben coincidir).
Define filtros para las actualizaciones de bloques. La clave que uses (por ejemplo, myBlockLabel) es una etiqueta definida por ti para esta configuración de filtro específica.
array
Filtra las transacciones y cuentas que involucren cualquier cuenta de la lista proporcionada.
boolean
Incluye todas las transacciones en la transmisión.
boolean
Incluye todas las actualizaciones de cuentas en la transmisión.
boolean
Incluye todas las entradas en la transmisión.
Funciona de forma similar a los bloques, pero excluye transacciones, cuentas y entradas. La clave que uses (por ejemplo, blockmetadata) es una etiqueta definida por ti para esta suscripción. Actualmente, no hay filtros disponibles para los metadatos de bloques; todos los mensajes se transmiten de forma predeterminada.
Suscríbete a las entradas del libro mayor. La clave que uses (por ejemplo, entrySubscribe) es una etiqueta definida por ti para esta suscripción. Actualmente, no hay filtros disponibles para las entradas; se transmiten todas.

Ejemplos de código (SDK de LaserStream)

Opciones de SDK

Ofrecemos SDK oficiales para varios lenguajes de programación: Para otros lenguajes o implementaciones personalizadas, puedes usar directamente los archivos proto de Yellowstone gRPC para generar clientes gRPC en el lenguaje que prefieras.

Solución de problemas / Preguntas frecuentes

R: Los problemas de rendimiento de las conexiones de LaserStream suelen deberse a:
  • Lentitud del cliente de JavaScript: El cliente de JavaScript puede quedarse atrás cuando procesa demasiados mensajes o consume demasiado ancho de banda. Considera aplicar filtros más específicos a tus suscripciones para reducir el volumen de mensajes, cambiar al SDK de JavaScript de LaserStream o usar otro lenguaje.
  • Ancho de banda local limitado: Las suscripciones de gran volumen pueden saturar a los clientes con un ancho de banda de red limitado. Supervisa el uso de tu red y considera mejorar tu conexión o reducir el alcance de la suscripción.
  • Distancia geográfica: Las rutas de red largas aumentan la latencia y la pérdida de paquetes. Usa el endpoint más cercano a tu servidor. Para conexiones de alta latencia, aumenta el tamaño de los búferes de lectura de red (puede mejorar el ancho de banda 5 veces o más):
    Para conservar la configuración después de reiniciar, agrégala a /etc/sysctl.conf:
    Aumenta a 64 MB el tamaño de las ventanas de stream y conexión de HTTP/2 para evitar cuellos de botella en el control de flujo. Ambas son necesarias: aumentar solo la ventana del stream deja la ventana a nivel de conexión como la restricción determinante:
  • Cuellos de botella en el procesamiento del cliente: Asegúrate de que tu lógica de procesamiento de mensajes esté optimizada y no bloquee el hilo principal durante periodos prolongados.
Depuración del retraso del cliente: Para ayudarte a depurar el cliente, creamos una herramienta que prueba el ancho de banda máximo desde tu nodo hasta un servidor de LaserStream gRPC. Para usarla, ejecuta:
El resultado devuelve la capacidad máxima de red entre tu servidor y el servidor de LaserStream. Necesitas como mínimo 10 MB/s para suscribirte a todos los datos de transacciones y 80 MB/s para suscribirte a todos los datos de cuentas. Recomendamos tener al menos el doble de la capacidad necesaria para obtener un rendimiento óptimo.
R: Verifica que tu clave de API y tu endpoint sean correctos, y que tu red permita conexiones gRPC salientes al endpoint especificado. Consulta la página de estado de Helius para comprobar si hay incidentes en curso.
R: Vuelve a comprobar los operadores lógicos (AND/OR) descritos en las secciones de filtros. Asegúrate de que las claves públicas sean correctas. Revisa el nivel de confirmación especificado en tu solicitud.
R: Sí, puedes definir configuraciones de filtros bajo varias claves (por ejemplo, accounts e transactions) dentro del mismo objeto SubscribeRequest.
R: No implementamos grupos de consumidores. En su lugar, LaserStream ofrece los mismos resultados que buscan los equipos: reanudación, reproducción y confiabilidad entre varios nodos sin una capa de coordinación ni la latencia y sobrecarga que conlleva. Creemos que los grupos de consumidores no son necesarios para la mayoría de las cargas de trabajo y que agregan latencia y sobrecarga operativa. Por ejemplo, una sola conexión de LaserStream gRPC puede emitir hasta 10 veces el volumen de datos de transacciones y cuentas de Solana, y la mayoría de los clientes se suscriben a una pequeña sección filtrada. Usar grupos de consumidores en este caso consume el margen de rendimiento e introduce otro punto de falla.
R: LaserStream trunca de forma predeterminada los mensajes de registro de transacciones a 10 KB para mejorar la velocidad y el rendimiento. Si necesitas los registros completos, conéctate a un endpoint dedicado sin truncamiento. Consulta Truncamiento de registros para ver la lista.
R: Incluir un campo ping en tu objeto SubscribeRequest inicial hace que LaserStream ignore silenciosamente todos los filtros de suscripción. Solo se devuelve un Pong, sin datos de cuentas, transacciones ni slots. Para corregirlo, elimina ping de la solicitud de suscripción inicial y, una vez establecida la suscripción, envía los pings por separado mediante el receptor del stream. Esto mantiene activa la conexión sin interferir con tus filtros.