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 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.{ offset: uint64, length: uint64 } que permite receber apenas os segmentos de dados necessários das contas.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.accountInclude).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.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.- 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
- Unary Methods
Opções de SDK
Oferecemos SDKs oficiais para várias linguagens de programação:- TypeScript: SDK do LaserStream para TypeScript
- Rust: SDK do LaserStream para Rust
- Go: SDK do LaserStream para Go
Solução de problemas / Perguntas frequentes
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?
- 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.
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) dentro do mesmo objeto 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 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.