Обзор
LaserStream — это управляемый сервис потоковой передачи Solana по gRPC. Он совместим на уровне протокола с открытым протоколом Yellowstone gRPC, поэтому любой клиент Yellowstone работает без дополнительной настройки. Кроме того, сервис предоставляет функции для промышленной эксплуатации, такие как воспроизведение исторических данных, аварийное переключение между несколькими узлами и полностью управляемая среда. LaserStream использует протокол gRPC с открытым исходным кодом, что исключает зависимость от поставщика и обеспечивает максимальную совместимость с существующими реализациями gRPC. Вы можете подключиться с помощью стандартного клиента@triton-one/yellowstone-grpc или использовать оптимизированный для высокой производительности Helius LaserStream SDK. Он обеспечивает более высокую пропускную способность, автоматическое переподключение, управление подписками, обработку ошибок и другие преимущества.
LaserStream SDK is 40x Faster vs. JavaScript Yellowstone Clients
Конечные точки и регионы
LaserStream доступен в нескольких регионах по всему миру. Для оптимальной производительности выберите ближайшую к вашему приложению конечную точку:Конечные точки Mainnet
Конечная точка Devnet
- Для приложений в промышленной эксплуатации выберите ближайшую к вашему серверу конечную точку Mainnet, чтобы получить максимальную производительность (например, при развёртывании в Европе используйте Амстердам (
ams) или Франкфурт (fra)) - Для тестирования используйте:
https://laserstream-devnet-ewr.helius-rpc.com.
Сжатие zstd
Все конечные точки LaserStream gRPC поддерживают сжатие zstd. Сжатие необходимо включать явно: ответы остаются несжатыми, если ваш клиент не заявляет о поддержке zstd.
Включите zstd в Helius LaserStream TypeScript SDK:
zstd сокращает использование пропускной способности сети, но требует дополнительных ресурсов для сжатия. Прежде чем включать его для чувствительных к задержкам потоков, протестируйте производительность с вашей нагрузкой подписки.
Усечение журналов
По умолчанию LaserStream усекает сообщения журналов транзакций до 10 КБ, чтобы повысить скорость и производительность. Если вам нужны полные журналы, доступны выделенные конечные точки без усечения — см. раздел Усечение журналов.Краткое руководство
Create a New Project
Install Dependencies
tsx, поскольку стандартный npx tsc --init в TypeScript 5.x задаёт verbatimModuleSyntax, module: "nodenext" и types: [], из-за чего быстрый запуск ts-node index.ts завершается с ошибкой. tsx запускает файлы .ts без tsconfig.Obtain Your API Key
Create a Subscription Script
index.ts со следующим содержимым:Replace Your API Key and Choose Your Region
index.ts обновите объект config, указав:- Фактический ключ API из панели управления Helius
- Ближайшую к расположению вашего сервера конечную точку LaserStream
- Для промышленной эксплуатации (Mainnet):
- Европа: используйте
fra(Франкфурт),ams(Амстердам) илиlon(Лондон) - Восток США: используйте
ewr(Нью-Йорк) - Запад США: используйте
slc(Солт-Лейк-Сити) илиlax(Лос-Анджелес) - Азия: используйте
tyo(Токио) илиsgp(Сингапур)
- Европа: используйте
- Для разработки (Devnet):
- Используйте
https://laserstream-devnet-ewr.helius-rpc.com
- Используйте
Run and View Results
confirmed затрагивает TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA, данные появляются в консоли.Распространённые сценарии
Пошаговые руководства для наиболее распространённых сценариев. В каждом руководстве используется SDKhelius-laserstream со встроенным автоматическим переподключением и воспроизведением исторических данных.
Account Subscriptions
Transaction Monitoring
Slot & Block Monitoring
Decoding Transaction Data
transactionUpdate в читаемые транзакции Solana.Stream Pump AMM Data
Запрос подписки
В запрос подписки необходимо включить следующие общие параметры:fromSlot (число u64) в основной объект SubscribeRequest, чтобы воспроизводить данные начиная с определённого слота. В настоящее время воспроизведение ограничено последними ~48 часами (~691 200 слотов при текущей скорости сети). Обратите внимание, что при воспроизведении данных старше ~20 минут возвращаются только финализированные данные.{ offset: uint64, length: uint64 }, позволяющий получать только необходимые фрагменты данных аккаунтов.Slots
Slots
mySlotLabel) — это заданная пользователем метка для данной конфигурации фильтра. При необходимости она позволяет определить несколько именованных конфигураций, хотя обычно достаточно одной.Accounts
Accounts
tokenAccounts) — это заданная пользователем метка для данной конфигурации фильтра.datasize и/или memcmp. Для memcmp сравниваемое значение указывается в одном из полей bytes, base58 или base64 непосредственно в объекте memcmp.notifyOn ни на что не влияет. Поле будет удалено позднее.- Поля объединяются логическим оператором И.
- Значения внутри массивов объединяются логическим оператором ИЛИ (кроме значений внутри
filters, которые объединяются логическим оператором И).
Transaction
Transaction
myTxSubscription) — это заданная пользователем метка для данной конфигурации фильтра.accountInclude).tokenAccounts (связанный токен-аккаунт). Если оно задано, кошелёк accountInclude также соответствует транзакциям, в которых он владеет балансом токенов SPL. Например, это входящие переводы токенов, затрагивающие токен-аккаунт кошелька, а не его открытый ключ. Допустимые значения: "balanceChanged" (соответствие по изменению баланса), "all" (любая ссылка, больший объём) или "none" (без расширения, значение по умолчанию). SDK преобразует строку в перечисление TokenAccountExpansionControlFlag уровня протокола (входит в yellowstone-grpc-proto 12.5.0+). Описание принципа и механизма работы см. в разделе Фильтрация токен-аккаунтов (ATA).matchMints (по умолчанию false). Если задано значение true, списки accountInclude, accountExclude и accountRequired также сопоставляются с адресами выпуска токенов в балансах токенов до и после транзакции, а не только с ключами её аккаунтов. Добавьте адрес выпуска в accountInclude, чтобы получать каждую транзакцию, затрагивающую этот токен, включая обычные переводы SPL, в ключах аккаунтов которых адрес выпуска не указывается. Функция включается явно и не влияет на существующие фильтры. Требуется helius-laserstream 0.8.5+ (JS), 0.6.4+ (Rust) или go/v0.3.0+ (Go). Семантику и примеры см. в разделе Фильтрация по адресу выпуска токена.- Поля объединяются логическим оператором И.
- Значения внутри массивов объединяются логическим оператором ИЛИ (кроме
accountRequired, где должны совпадать все значения).
Block
Block
myBlockLabel) — это заданная пользователем метка для данной конфигурации фильтра.Blocks Meta
Blocks Meta
blockmetadata) — это заданная пользователем метка для данной подписки. В настоящее время фильтры метаданных блоков недоступны: по умолчанию передаются все сообщения.Entries
Entries
entrySubscribe) — это заданная пользователем метка для данной подписки. В настоящее время фильтры для записей недоступны; передаются все записи.Примеры кода (LaserStream SDK)
- Slot Updates
- Account Updates
- Transaction Updates
- Blocks
- Block Metadata
- Entries
- Unary Methods
Варианты SDK
Мы предоставляем официальные SDK для нескольких языков программирования:- TypeScript: LaserStream TypeScript SDK
- Rust: LaserStream Rust SDK
- Go: LaserStream Go SDK
Устранение неполадок и часто задаваемые вопросы
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?
- Низкая скорость клиента JavaScript: клиент JavaScript может отставать при обработке слишком большого количества сообщений или использовании чрезмерной пропускной способности. Попробуйте сузить фильтры подписок, чтобы сократить объём сообщений, перейти на LaserStream JavaScript SDK или использовать другой язык.
- Ограниченная локальная пропускная способность: интенсивные подписки могут перегружать клиентов с ограниченной пропускной способностью сети. Отслеживайте использование сети и рассмотрите возможность улучшить подключение или сузить область подписки.
-
Географическая удалённость: длинные сетевые маршруты увеличивают задержку и потерю пакетов. Используйте ближайшую к вашему серверу конечную точку. Для подключений с высокой задержкой увеличьте размеры буферов чтения сети — это может повысить пропускную способность в 5 и более раз:
Чтобы сохранить настройки после перезагрузки, добавьте в
/etc/sysctl.conf:Увеличьте размеры окон потока и подключения HTTP/2 до 64 МБ, чтобы избежать узких мест при управлении потоком. Необходимо изменить оба значения: если увеличить только окно потока, ограничивающим фактором останется окно на уровне подключения: - Узкие места при обработке на стороне клиента: убедитесь, что логика обработки сообщений оптимизирована и не блокирует основной поток на длительное время.
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?
SubscribeRequest можно определить конфигурации фильтров под несколькими ключами (например, accounts и transactions).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 в исходный объект SubscribeRequest, LaserStream без уведомления проигнорирует все фильтры подписки. В результате будет возвращаться только Pong без данных аккаунтов, транзакций или слотов. Чтобы исправить это, удалите ping из исходного запроса подписки, а после установления подписки отправляйте запросы ping отдельно через приёмник потока. Это сохранит подключение активным, не мешая работе фильтров.