Skip to main content

Visão Geral

LaserStream é um serviço gerenciado de streaming Solana gRPC. É compatível com o protocolo Yellowstone gRPC aberto — então qualquer cliente Yellowstone funciona imediatamente — e adiciona recursos de produção como reprodução histórica, failover multiponto e um ambiente totalmente gerenciado. LaserStream usa o protocolo gRPC de código aberto, garantindo que não haja bloqueio de fornecedor e a máxima compatibilidade com implementações gRPC existentes. Você pode se conectar tanto com o cliente padrão @triton-one/yellowstone-grpc quanto usar o Helius LaserStream SDK otimizado para desempenho para benefícios adicionais, incluindo maior throughput, reconexões automáticas, gerenciamento de assinaturas, tratamento de erros e mais.

LaserStream SDK é 40x mais rápido em relação a clientes Yellowstone JavaScript

Saiba como usamos Rust Core com bindings NAPI zero-copy para maximizar o desempenho do SDK JavaScript
Aviso de Desempenho: Se você experimentar alguma lentidão ou problemas de desempenho com sua conexão LaserStream, consulte a seção de Solução de Problemas para causas e soluções comuns.

Endpoints & Regiões

LaserStream está disponível em várias regiões ao redor do mundo. Escolha o endpoint mais próximo de sua aplicação para obter melhor desempenho:

Endpoints Mainnet

Endpoint Devnet

Seleção de Rede & Região:
  • Para aplicações de produção, escolha o endpoint mainnet mais próximo de seu servidor para obter melhor desempenho (por exemplo, se implantar na Europa, use Amsterdã (ams) ou Frankfurt (fra))
  • Para testes, use: https://laserstream-devnet-ewr.helius-rpc.com.

zstd Compressão

Todos os endpoints gRPC do LaserStream suportam a compressão zstd. A compressão é opcional: as respostas permanecem descompactadas a menos que seu cliente anuncie suporte zstd. Habilite zstd no Helius LaserStream TypeScript SDK:
zstd reduz a largura de banda da rede, mas adiciona o trabalho de compressão. Avalie com sua carga de trabalho de assinatura antes de ativá-la para streams sensíveis à latência.

Truncamento de Logs

Por padrão, o LaserStream trunca mensagens de log de transações para 10 KB para melhor velocidade e desempenho. Se precisar de logs completos, endpoints dedicados não truncados estão disponíveis — veja Truncamento de Logs.

Início Rápido

Comece com o LaserStream a partir do seu Painel Helius. O mainnet requer um plano Business ou Professional; o Devnet está disponível no Developer e superior. Veja Planos & Preços para detalhes.
1

Criar um Novo Projeto

2

Instalar Dependências

Usamos tsx porque o padrão npx tsc --init no TypeScript 5.x define verbatimModuleSyntax, module: "nodenext" e types: [], que todos quebram uma execução rápida ts-node index.ts. tsx executa arquivos .ts sem um tsconfig.
3

Obter Sua Chave API

Gere uma chave no Painel Helius.Esta chave servirá como seu token de autenticação para o LaserStream.
Requisitos de Plano: O LaserStream devnet está disponível em todos os planos. O LaserStream mainnet requer um plano Business ou Professional.
4

Criar um Script de Assinatura

Crie index.ts com o seguinte:
5

Substituir Sua Chave API e Escolher Sua Região

No index.ts, atualize o objeto config com:
  1. Sua chave API real do Painel Helius
  2. O endpoint LaserStream mais próximo do local do seu servidor
Exemplos de Seleção de Rede & Região:
  • Para Produção (Mainnet):
    • Europa: Use fra (Frankfurt), ams (Amsterdã) ou lon (Londres)
    • US Leste: Use ewr (Nova York)
    • US Oeste: Use slc (Salt Lake City) ou lax (Los Angeles)
    • Ásia: Use tyo (Tóquio) ou sgp (Singapura)
  • Para Desenvolvimento (Devnet):
    • Use https://laserstream-devnet-ewr.helius-rpc.com
6

Executar e Ver Resultados

Sempre que uma transação de token confirmed envolver TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, você verá os dados no seu console.

Fluxos de Trabalho Comuns

Guias passo a passo para os fluxos de trabalho que vemos com mais frequência. Cada guia usa o SDK helius-laserstream com reconexão automática e reprodução histórica integrada.

Assinaturas de Conta

Monitore alterações de saldo, dados e propriedade em contas específicas com filtros.

Monitoramento de Transações

Transmita transações envolvendo contas-alvo, filtre por programa, voto ou status de falha.

Monitoramento de Slots & Blocos

Acompanhe o consenso da rede, produção de blocos e transições de nível de compromisso.

Decodificação de Dados de Transações

Faça o parse dos payloads binários transactionUpdate em transações Solana legíveis.

Stream de Dados Pump AMM

Exemplo do mundo real: monitore negociações Pump AMM com filtros seguros para reconexão.
O cliente @triton-one/yellowstone-grpc funciona nos mesmos endpoints se você preferir o protocolo Yellowstone bruto. Veja a referência do Yellowstone gRPC para detalhes no nível do protocolo.

Pedido de Inscrição

No pedido de inscrição, você precisa incluir os seguintes parâmetros gerais:
Reprodução histórica: Opcionalmente, você pode incluir um campo fromSlot (um número u64) no objeto SubscribeRequest principal para reproduzir dados a partir de um slot específico. No momento, a reprodução está limitada às últimas ~48 horas (~691.200 slots na velocidade atual da rede). Observe que reproduções de mais de ~20 minutos retornam apenas dados finalizados.
enum
Especifica o nível de confirmação, que pode ser processed, confirmed ou finalized.
array
Uma matriz de objetos { offset: uint64, length: uint64 } que permite receber apenas os segmentos de dados necessários das contas.
boolean
Alguns provedores de nuvem (como a Cloudflare) podem encerrar streams ociosos após um período de inatividade. Para evitar isso e manter a conexão ativa sem precisar reenviar os filtros, defina esta opção como true. O servidor responderá com uma mensagem Pong a cada 15 segundos.
Em seguida, você precisará especificar os filtros para os dados aos quais deseja se inscrever, como contas, blocos, slots ou transações.
Defina filtros para atualizações de slot. A chave que você usa (por exemplo, mySlotLabel) é um rótulo definido pelo usuário para esta configuração de filtro específica, permitindo que você defina potencialmente várias configurações nomeadas, se necessário (embora geralmente uma seja suficiente).
boolean
Por padrão, os slots são enviados para todos os níveis de confirmação. Com este filtro, você pode optar por receber apenas o nível de confirmação selecionado.
boolean
Permite que a assinatura receba atualizações sobre alterações dentro de um slot, não apenas no início de novos slots. Isso é útil para obter dados de slot mais granulares e com baixa latência.
Defina filtros para atualizações de dados de contas. A chave que você usa (por exemplo, tokenAccounts) é um rótulo definido pelo usuário para esta configuração de filtro específica.
array
Corresponde a qualquer chave pública da array fornecida.
array
A chave pública do proprietário da conta. Corresponde a qualquer chave pública da array fornecida.
array
Semelhante aos filtros em getProgramAccounts. Esta é uma array de filtros datasize e/ou memcmp. Para memcmp, o comparando vai em um dos bytes, base58 ou base64 diretamente no objeto memcmp.
enum
obsoleto
Depreciado — sem operação a partir do Agave 4.2. Configurar notifyOn não tem efeito. O campo será removido posteriormente.
Se todos os campos estiverem vazios, todas as contas serão transmitidas. Caso contrário:
  • Os campos operam como um E lógico.
  • Valores dentro de arrays funcionam como um OU lógico (exceto dentro de filters, que operam como um E lógico).
Rastreando mais de ~10.000 contas? Em vez de uma lista explícita de chaves públicas (32 bytes por conta), use um filtro cuckoo comprimido (~3–4 bytes por conta) para se inscrever em centenas de milhares de contas em um único stream. Disponível nos SDKs Rust e JavaScript.
Defina filtros para atualizações de transação. A chave que você usa (por exemplo, myTxSubscription) é um rótulo definido pelo usuário para esta configuração de filtro específica.
boolean
Ativa ou desativa a transmissão de transações de voto.
boolean
Ativa ou desativa a transmissão de transações com falha.
string
Transmite apenas as transações que correspondem à assinatura especificada.
array
Filtra as transações que envolvem qualquer conta da lista fornecida.
array
Exclui as transações que envolvem qualquer conta da lista fornecida (o oposto de accountInclude).
array
Filtra as transações que envolvem todas as contas da lista fornecida (todas as contas devem ser usadas).
string
Expansão tokenAccounts opcional (conta de token associada). Quando definida, uma carteira accountInclude também corresponde a transações nas quais ela possui um saldo de token SPL — por exemplo, transferências de tokens recebidas que afetam a conta de token da carteira em vez de sua chave pública. Aceita "balanceChanged" (correspondências de variação de saldo), "all" (qualquer referência, maior volume) ou "none" (sem expansão, o padrão). O SDK converte a string no enum TokenAccountExpansionControlFlag do protocolo (parte de yellowstone-grpc-proto 12.5.0+). Consulte Filtragem por conta de token (ATA) para saber o que esse recurso faz e como funciona.
boolean
Flag matchMints opcional (padrão: false). Quando definida como true, as listas accountInclude, accountExclude e accountRequired também são comparadas com os mints nos saldos de tokens anteriores e posteriores à transação, não apenas com as chaves de conta dela. Adicione um mint a accountInclude para receber todas as transações que afetam esse token, incluindo transferências SPL simples que nunca fazem referência ao mint em suas chaves de conta. É uma opção ativada explicitamente e não afeta os filtros existentes. Requer helius-laserstream 0.8.5+ (JS), 0.6.4+ (Rust) ou go/v0.3.0+ (Go). Consulte Filtragem por mint de token para ver a semântica e os exemplos.
Se todos os campos forem deixados vazios, todas as transações serão transmitidas. Caso contrário:
  • Os campos operam como um E lógico.
  • Valores dentro de arrays são tratados como um OU lógico (exceto para accountRequired, onde todos devem corresponder).
Defina filtros para atualizações de bloco. A chave que você usa (por exemplo, myBlockLabel) é um rótulo definido pelo usuário para esta configuração de filtro específica.
array
Filtra as transações e contas que envolvem qualquer conta da lista fornecida.
boolean
Inclui todas as transações na transmissão.
boolean
Inclui todas as atualizações de contas na transmissão.
boolean
Inclui todas as entradas na transmissão.
Isto funciona de maneira semelhante aos Blocos, mas exclui transações, contas e entradas. A chave que você usa (por exemplo, blockmetadata) é um rótulo definido pelo usuário para esta inscrição. Atualmente, não há filtros disponíveis para metadados de blocos — todas as mensagens são transmitidas por padrão.
Inscreva-se para entradas de ledger. A chave que você usa (por exemplo, entrySubscribe) é um rótulo definido pelo usuário para esta inscrição. Atualmente, não há filtros disponíveis para entradas; todas as entradas são transmitidas.

Exemplos de Código (SDK do LaserStream)

Opções de SDK

Oferecemos SDKs oficiais para várias linguagens de programação: Para outras linguagens ou implementações personalizadas, você pode usar diretamente os arquivos proto do Yellowstone gRPC para gerar clientes gRPC para a linguagem de sua preferência.

Solução de problemas / Perguntas frequentes

R: Os problemas de desempenho com conexões do LaserStream geralmente são causados por:
  • Lentidão do cliente JavaScript: O cliente JavaScript pode ficar defasado ao processar mensagens demais ou consumir muita largura de banda. Considere restringir os filtros das suas assinaturas para reduzir o volume de mensagens, mudar para o SDK JavaScript do LaserStream ou usar outra linguagem.
  • Largura de banda local limitada: Assinaturas de alto volume podem sobrecarregar clientes com largura de banda de rede limitada. Monitore o uso da rede e considere melhorar sua conexão ou reduzir o escopo da assinatura.
  • Distância geográfica: Rotas de rede longas aumentam a latência e a perda de pacotes. Use o endpoint mais próximo do seu servidor. Para conexões de alta latência, aumente os tamanhos dos buffers de leitura da rede (isso pode melhorar a largura de banda em mais de 5 vezes):
    Para manter a configuração após reinicializações, adicione-a a /etc/sysctl.conf:
    Aumente os tamanhos das janelas de stream e conexão HTTP/2 para 64 MB a fim de evitar gargalos no controle de fluxo. Ambas são necessárias — aumentar apenas a janela do stream mantém a janela no nível da conexão como a restrição determinante:
  • Gargalos no processamento do lado do cliente: Verifique se a lógica de processamento de mensagens está otimizada e não bloqueia a thread principal por períodos prolongados.
Depuração da defasagem do cliente: Para ajudar você a depurar o cliente, criamos uma ferramenta que testa a largura de banda máxima entre seu nó e um servidor gRPC do LaserStream. Para usá-la, execute:
A saída retorna a capacidade máxima de rede entre o seu servidor e o servidor do LaserStream. Você precisa de, no mínimo, 10 MB/s para assinar todos os dados de transações e 80 MB/s para assinar todos os dados de contas. Recomendamos ter pelo menos o dobro da capacidade necessária para obter o desempenho ideal.
R: Verifique se a sua chave de API e o endpoint estão corretos e se a sua rede permite conexões gRPC de saída com o endpoint especificado. Consulte a página de status da Helius para verificar se há algum incidente em andamento.
R: Confira novamente os operadores lógicos (AND/OR) descritos nas seções sobre filtros. Verifique se as chaves públicas estão corretas. Revise o nível de confirmação especificado na sua solicitação.
R: Sim, você pode definir configurações de filtro em várias chaves (por exemplo, accounts, transactions) dentro do mesmo objeto SubscribeRequest.
R: Não implementamos grupos de consumidores. Em vez disso, o LaserStream oferece os mesmos resultados que as equipes buscam: retomada, reprodução e confiabilidade em vários nós sem uma camada de coordenação (e sem a latência e a sobrecarga associadas a ela). Acreditamos que grupos de consumidores não são necessários para a maioria das cargas de trabalho e que eles adicionam latência e sobrecarga operacional. Por exemplo, uma única conexão gRPC do LaserStream pode emitir até 10 vezes o volume combinado de dados de transações e contas da Solana, e a maioria dos clientes assina uma pequena parcela filtrada. Nesse caso, o uso de grupos de consumidores desperdiça a margem de desempenho e introduz outro ponto de falha.
R: Por padrão, o LaserStream trunca as mensagens de log de transações em 10 KB para oferecer mais velocidade e desempenho. Se você precisar dos logs completos, conecte-se a um endpoint dedicado sem truncamento — consulte Truncamento de logs para ver a lista.
R: Incluir um campo ping no seu SubscribeRequest inicial faz com que o LaserStream ignore silenciosamente todos os filtros de assinatura — apenas um Pong é retornado, sem nenhum dado de conta, transação ou slot. Para corrigir isso, remova ping da solicitação de assinatura inicial e envie pings separadamente pelo sink do stream depois que a assinatura for estabelecida. Isso mantém a conexão ativa sem interferir nos filtros.