Skip to main content
Публичная бета-версия. preprocessedSubscribe доступен на всех платных тарифах и тарифицируется по ставке 0,1 кредита за сообщение (одно сообщение на каждую доставленную транзакцию).

Что такое preprocessedSubscribe?

preprocessedSubscribe — это метод WebSocket от Helius, который передает поток предварительно обработанных транзакций — транзакций Solana до выполнения, доставляемых до достижения ими уровня подтверждения processed. Helius объединяет несколько источников данных до выполнения — главным образом шреды, декодируемые непосредственно по мере их поступления валидатору и дополненные сигналами предварительного подтверждения, — и доставляет их в виде единого дедуплицированного потока компактных бинарных сообщений. Вам не требуется собственная инфраструктура сборки шредов. Транзакции, полученные из сигналов предварительного подтверждения, поступают в этот поток позже, чем в специализированный продукт Preconfirmations, который по-прежнему обеспечивает самый ранний доступ к ним. Этот метод пришел на смену предыдущему продукту предварительно обработанных данных LaserStream (gRPC). Если сейчас вы получаете предварительно обработанные транзакции через gRPC, перейдите на этот метод: он доставляет тот же класс данных через обычное соединение WebSocket с меньшей задержкой, а доставка через gRPC будет объявлена устаревшей.
preprocessedSubscribe — это сигнал до выполнения, предоставляемый без гарантий, а не уровень подтверждения. Переданная в потоке транзакция может завершиться ошибкой, быть отброшена или попасть в другую ветвь. Сопоставьте ее с обработанным или подтвержденным потоком, прежде чем считать окончательной.

Конечная точка

preprocessedSubscribe обслуживается через wss://beta.helius-rpc.com — конечную точку Helius Gatekeeper, — а не через mainnet.helius-rpc.com. Для аутентификации передайте ключ API в качестве параметра запроса:
Для каждого ключа API разрешено не более 10 одновременных соединений/подписок.

Подписка

Отправьте запрос JSON-RPC с методом preprocessedSubscribe. Обязательный параметр params содержит фильтры аккаунтов: в accountInclude и accountRequired должен быть указан хотя бы один аккаунт (см. раздел Фильтрация):
Сервер подтверждает подписку текстовым кадром JSON, содержащим идентификатор подписки:
После этого подтверждения обновления транзакций поступают в виде бинарных кадров WebSocket — см. раздел Полезные данные уведомления.

Фильтрация

Область каждой подписки определяется фильтрами аккаунтов в params. Фильтрация выполняется на стороне сервера, поэтому вы получаете только нужные вам транзакции:
Правила фильтрации:
  • Три фильтра объединяются логическим оператором AND.
  • В accountInclude и accountRequired должен быть указан хотя бы один аккаунт — полный поток без фильтрации недоступен.
  • Аккаунты указываются как публичные ключи в кодировке base58. Каждый список может содержать до 5 000 адресов.

Разрешение таблиц поиска адресов (ALT)

Фильтры аккаунтов сопоставляются не только со статическими ключами аккаунтов транзакции: Helius разрешает таблицы поиска адресов на стороне сервера, поэтому accountInclude, accountExclude и accountRequired также сопоставляются с аккаунтами, которые транзакция загружает через ALT. Просто передайте публичный ключ аккаунта. Вам не нужно вести сопоставления ALT или самостоятельно разрешать таблицы.

Полезные данные уведомления

Уведомления доставляются в виде бинарных кадров WebSocket, а не JSON. Каждый кадр содержит одну транзакцию в упакованной структуре байтов: Последовательно прочитайте фиксированный 73-байтовый префикс, а затем декодируйте оставшиеся байты, чтобы получить инструкции, аккаунты и обращения к таблицам адресов. Подпись включена в префикс, поэтому вы можете идентифицировать и дедуплицировать транзакцию, не декодируя ее полное тело. Всегда сначала считывайте и проверяйте байт version. Если Helius потребуется обновить формат полезных данных, номер версии увеличится. Добавьте ветвление по нему, чтобы декодер продолжал работать после изменений схемы.

Декодирование транзакции

Байты транзакции передаются в точности в том виде, в котором они наблюдались в сети, в стандартной сетевой кодировке соответствующей версии транзакции. Транзакции устаревшего формата и v0 используют структуру с подписями в начале, которую создает bincode. Транзакции v1 (SIMD-0385) используют структуру с сообщением в начале и подписями в конце, поэтому bincode не может обработать полезные данные v1. Используйте декодер, поддерживающий все версии:
  • Rust: agave-transaction-view выполняет разбор транзакций устаревшего формата, v0 и v1 на месте, без промежуточного копирования. Это рекомендуемый вариант. wincode, совместимый с bincode сериализатор, который используется текущими SDK Solana, также декодирует v1 в VersionedTransaction.
  • JavaScript / TypeScript: убедитесь, что версия вашей библиотеки поддерживает транзакции v1. Более старые реализации VersionedTransaction.deserialize поддерживают только устаревший формат и v0. Используйте @solana/kit 8.0+ или @solana/web3.js v3. См. раздел Поддержка транзакций v1.

Пример

Какие данные доступны?

Каждое уведомление содержит подписанную транзакцию, ее первую подпись и слот. Поскольку доставка происходит до выполнения, поток не содержит:
  • Статус выполнения или ошибки
  • Балансы до и после выполнения или изменения балансов токенов
  • Сообщения журналов или внутренние инструкции
  • Количество использованных вычислительных единиц
Рассматривайте это как получение «предложения» без «результата»: вы видите, что отправитель пытался сделать, но не видите, что произошло на самом деле. Обновлений состояния аккаунтов и программ на этом этапе также еще не существует. Если вам нужно состояние аккаунтов в реальном времени, используйте LaserStream gRPC с уровнем подтверждения processed.

Обратное давление

Поток не буферизует данные для медленных потребителей бесконечно. Если ваш клиент читает слишком медленно и на стороне сервера накапливается более 4 000 сообщений, Helius закрывает соединение — вы получаете корректный кадр закрытия WebSocket. Обрабатывайте кадры быстрее, чем они поступают: вынесите ресурсоемкие операции, такие как декодирование транзакций и логика стратегии, за пределы цикла приема. После отключения повторно подключитесь и оформите подписку заново.

Гарантии доставки

Доставка выполняется без гарантий, а воспроизведение исторических данных недоступно. Клиентам следует:
  1. Повторно подключаться и оформлять подписку заново после закрытия соединения.
  2. Выполнять дедупликацию по подписи транзакции.
  3. Считать слот наблюдением, а не окончательным результатом.
  4. Сопоставлять данные с обработанным или подтвержденным потоком, когда важны результаты выполнения.

Тарификация

preprocessedSubscribe доступен на всех платных тарифах и тарифицируется по ставке 0,1 кредита за сообщение — одно сообщение на каждую доставленную транзакцию, со списанием в рамках вашего тарифа. Подробности см. в разделе Кредиты.

Связанные материалы

Preconfirmations

Транзакции, передаваемые в потоке до их преобразования в шреды, — самый ранний сигнал о транзакции.

Raw Shreds (UDP)

Необработанные пакеты шредов через UDP. Сборку шредов реализуете вы.

transactionSubscribe

Транзакции после выполнения с расширенной фильтрацией и метаданными выполнения.