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
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
- 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
Criar um Novo Projeto
Instalar Dependências
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.Obter Sua Chave API
Criar um Script de Assinatura
index.ts com o seguinte:Substituir Sua Chave API e Escolher Sua Região
index.ts, atualize o objeto config com:- Sua chave API real do Painel Helius
- O endpoint LaserStream mais próximo do local do seu servidor
- Para Produção (Mainnet):
- Europa: Use
fra(Frankfurt),ams(Amsterdã) oulon(Londres) - US Leste: Use
ewr(Nova York) - US Oeste: Use
slc(Salt Lake City) oulax(Los Angeles) - Ásia: Use
tyo(Tóquio) ousgp(Singapura)
- Europa: Use
- Para Desenvolvimento (Devnet):
- Use
https://laserstream-devnet-ewr.helius-rpc.com
- Use
Executar e Ver Resultados
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 SDKhelius-laserstream com reconexão automática e reprodução histórica integrada.
Assinaturas de Conta
Monitoramento de Transações
Monitoramento de Slots & Blocos
Decodificação de Dados de Transações
transactionUpdate em transações Solana legíveis.Stream de Dados Pump AMM
Pedido de Inscrição
No pedido de inscrição, você precisa incluir os seguintes parâmetros gerais:fromSlot (um número u64) no objeto principal SubscribeRequest para reproduzir dados a partir de um slot específico. A reprodução atualmente é limitada aos últimos 216.000 slots (≈24 horas); observe que reproduções mais antigas que ~20 minutos retornam apenas dados finalizados.Slots
Slots
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).Contas
Contas
tokenAccounts) é um rótulo definido pelo usuário para esta configuração de filtro específica.datasize e/ou memcmp. Para memcmp, o comparando vai em um dos bytes, base58 ou base64 diretamente no objeto memcmp.notifyOn não tem efeito. O campo será removido posteriormente.- 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).
Transação
Transação
myTxSubscription) é um rótulo definido pelo usuário para esta configuração de filtro específica.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).
Bloco
Bloco
myBlockLabel) é um rótulo definido pelo usuário para esta configuração de filtro específica.Metadados do Bloco
Metadados do Bloco
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.Entradas
Entradas
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)
- Atualizações de Slot
- Atualizações de Conta
- Atualizações de Transação
- Blocos
- Metadados de Bloco
- Entradas
Opções de SDK
Fornecemos SDKs oficiais para várias linguagens de programação:- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
Solução de Problemas / FAQ
Q: Estou experimentando atrasos ou desempenho lento com minha conexão LaserStream. O que pode estar causando isso?
Q: Estou experimentando atrasos ou desempenho lento com minha conexão LaserStream. O que pode estar causando isso?
- Lentidão do Cliente JavaScript: O cliente JavaScript pode ficar para trás ao processar muitas mensagens ou consumir muita largura de banda. Considere filtrar suas inscrições mais estreitamente para reduzir o volume de mensagens, mudar para o LaserStream JavaScript SDK ou tentar usar outra linguagem.
- Largura de Banda Local Limitada: Inscrições pesadas podem sobrecarregar clientes com largura de banda de rede limitada. Monitore seu uso de rede e considere atualizar 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 (pode melhorar a largura de banda em mais de 5x):
Para persistir entre reinicializações, adicione a
/etc/sysctl.conf:Aumente os tamanhos de janela do stream e da conexão HTTP/2 para 64MB para evitar gargalos de controle de fluxo. Ambos são necessários — aumentar apenas a janela do stream deixa a janela no nível da conexão como a restrição de ligação: - Gargalos de Processamento do Lado do Cliente: Certifique-se de que sua lógica de processamento de mensagens está otimizada e não bloqueia o thread principal por períodos prolongados.
Q: Estou recebendo erros de conexão. O que devo verificar?
Q: Estou recebendo erros de conexão. O que devo verificar?
Q: Por que meus filtros não estão funcionando como esperado?
Q: Por que meus filtros não estão funcionando como esperado?
Q: Posso me inscrever para vários tipos de dados (por exemplo, contas e transações) em uma única solicitação?
Q: Posso me inscrever para vários tipos de dados (por exemplo, contas e transações) em uma única solicitação?
accounts, transactions) dentro do mesmo objeto SubscribeRequest.Q: O LaserStream suporta grupos de consumidores?
Q: O LaserStream suporta grupos de consumidores?
Q: Por que minhas mensagens de log de transação estão sendo cortadas?
Q: Por que minhas mensagens de log de transação estão sendo cortadas?
Q: Por que estou recebendo apenas respostas Pong sem dados de conta ou slot?
Q: Por que estou recebendo apenas respostas Pong sem dados de conta ou slot?
ping em sua inicialização SubscribeRequest faz com que o LaserStream ignore silenciosamente todos os filtros de inscrição — apenas um Pong é retornado com zero de dados de conta, transação ou slot. Para corrigir isso, remova ping do pedido de inscrição inicial e, em vez disso, envie pings separadamente pelo sink do stream após a assinatura ser estabelecida. Isso mantém a conexão ativa sem interferir em seus filtros.