Что такое preconfSubscribe?
preconfSubscribe — это метод WebSocket от Helius, который передает поток Preconfirmations — транзакций, доставленных до того, как они будут собраны в записи и разделены на Shred. Это сигнал о транзакции с самой низкой задержкой, который предлагает Helius. Одна подписка доставляет как предварительные подтверждения Helius, отправляемые сразу после выполнения транзакции лидером и содержащие статус ее выполнения, так и предварительные подтверждения BAM от валидаторов, использующих клиент Jito Block Assembly Marketplace. Они отправляются, когда валидатор обязуется выполнить транзакцию. Для доступа требуется тариф Professional или выше — см. раздел Стоимость.
Поток не является непрерывным. Покрытие зависит от доли стейка,
перенаправляемой в Helius или использующей BAM, поэтому в некоторых слотах сообщений не будет — корректно
обрабатывайте такие пропуски. См. раздел Покрытие.
preconfSubscribe обслуживается через wss://beta.helius-rpc.com — конечную точку Helius Gatekeeper, а не через mainnet.helius-rpc.com. Для аутентификации передайте ключ API в качестве параметра запроса.
Имя хоста
beta относится к развертыванию Gatekeeper,
а не к степени готовности Preconfirmations. Сначала Preconfirmations запускаются на
конечной точке Gatekeeper; она станет стандартной конечной точкой по мере того, как Helius
будет переносить трафик в Gatekeeper.Подписка
Отправьте запрос JSON-RPC с методомpreconfSubscribe. Сервер ответит идентификатором подписки, а затем будет передавать уведомление для каждой транзакции. Передайте необязательный фильтр в качестве первого элемента params, чтобы получать только соответствующие транзакции; не указывайте params, чтобы получать полный поток как от Helius, так и от BAM.
Ответ на подписку
result — это идентификатор подписки, который используется для отмены подписки. После этого подтверждения уведомления передаются в виде двоичных кадров (см. ниже).
Фильтрация
По умолчаниюpreconfSubscribe передает каждую транзакцию из обоих источников. Чтобы сузить поток, передайте объект фильтра в качестве первого элемента params. Фильтрация выполняется на стороне сервера, поэтому вы получаете и оплачиваете только интересующие вас транзакции.
params) соответствует каждой транзакции из обоих источников.
Правила фильтрации:
- Все предикаты объединяются логическим И и вычисляются в следующем порядке:
includeBam→failed→regionInclude→signatures→accountExclude→accountRequired→accountInclude→signerExclude→signerInclude→instructions. - Предварительные подтверждения BAM с неизвестным статусом игнорируют фильтр
failed. Предварительные подтверждения Helius с неизвестным статусом не соответствуют явно заданному фильтруfailed. - Учетные записи представляют собой открытые ключи в кодировке base58. Недопустимое значение возвращает ошибку JSON-RPC
-32602(недопустимые параметры). - Каждый список учетных записей или подписантов ограничен 10 000 элементами.
signaturesограничен 1 000 элементами.
Фильтрация по подписанту и подписи
ИспользуйтеsignerInclude, чтобы находить транзакции, подписанные определенной учетной записью. Используйте signerExclude, чтобы исключать транзакции, подписанные любой из перечисленных учетных записей. Учетная запись, на которую ссылается транзакция, не считается подписантом.
Используйте signatures, если вы уже знаете, какие транзакции хотите отслеживать. Фильтр сопоставляет первую подпись транзакции — именно эту подпись используют методы Solana RPC. После оформления подписки фильтр изменить нельзя, поэтому для отслеживания новых подписей создайте новую подписку.
Фильтрация инструкций
Используйтеinstructions, чтобы сопоставлять инструкции верхнего уровня по программе и данным инструкции. Каждый фильтр инструкций поддерживает следующие поля:
Каждый элемент
memcmp принимает кодировку base58, base64 или hex. По умолчанию используется base58. Транзакция соответствует фильтру, если одна инструкция верхнего уровня удовлетворяет всем условиям любого фильтра инструкций.
Следующий запрос сопоставляет инструкции pump.fun buy по их дискриминатору Anchor:
memcmp на каждый фильтр инструкций. Каждое значение memcmp должно декодироваться в последовательность длиной от 1 до 128 байт. Конечное смещение memcmp и dataSize не должны превышать 4 096 байт.
Разрешение таблиц поиска адресов (ALT)
Фильтры учетных записей сопоставляются не только со статическими ключами учетных записей транзакции — Helius разрешает таблицы поиска адресов v0 на стороне сервера, поэтомуaccountInclude, accountExclude и accountRequired также сопоставляются с учетными записями, которые транзакция загружает через ALT.
Это означает, что вы можете фильтровать по любой учетной записи, с которой взаимодействует транзакция, даже если она указана только через таблицу поиска. Вам не нужно поддерживать сопоставления ALT или самостоятельно разрешать таблицы. Просто передайте открытый ключ учетной записи, и Helius выполнит разрешение перед применением фильтра.
Фильтрация по местоположению
ИспользуйтеregionInclude, чтобы получать только транзакции, поступающие из определенных регионов. Передайте один или несколько кодов регионов; транзакция проходит фильтр, если регион ее происхождения соответствует любому из них.
sgp и dal.
Допустимые коды регионов:
Если задан
regionInclude, транзакции без информации о регионе исключаются. Нераспознанный код региона возвращает ошибку JSON-RPC -32602 (недопустимые параметры).Полезная нагрузка уведомления
Уведомления доставляются в виде двоичных кадров WebSocket (не JSON). Предварительные подтверждения Helius и BAM имеют одинаковую структуру. Каждый кадр представляет собой упакованную последовательность байтов, содержащую одну транзакцию:
Полезная нагрузка не содержит поля источника. Не делайте вывод о происхождении из BAM на основании
tx_index = 0, поскольку другие источники также могут возвращать 0.
Как различать два источника
Поскольку поле источника отсутствует, произвольное сообщение нельзя однозначно отнести к Helius или BAM. Байтstatus позволяет выполнить одностороннюю классификацию:
statusравен0или1— сообщение является предварительным подтверждением Helius, а транзакция была выполнена. BAM никогда не возвращает эти значения.statusравен2— источник неоднозначен: это либо предварительное подтверждение BAM, либо предварительное подтверждение Helius, для которого статус выполнения был недоступен.
regionInclude — это фильтр подписки, а не поле полезной нагрузки, поэтому его нельзя прочитать для отдельного сообщения.
Если требуется, чтобы каждое сообщение в потоке содержало свидетельство одного типа, задайте includeBam: false — в потоке останутся только предварительные подтверждения Helius, отправляемые во время выполнения лидером. Фильтра только для BAM нет.
Предварительное подтверждение — это ранний сигнал, а не гарантия. Транзакция еще не
попала в блокчейн и все еще может быть исключена, а статус выполнения в предварительном подтверждении 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/kit8.0+ или@solana/web3.jsv3. См. раздел Поддержка транзакций v1.
Дублирующиеся уведомления
Предварительные подтверждения Helius и BAM дедуплицируются отдельно для каждого источника, но не между источниками. Небольшая доля транзакций поступает в Helius обоими способами, поэтому одну и ту же подпись можно получить дважды, причем две копии могут указывать разные слоты. Выполняйте дедупликацию по подписи на стороне клиента и сделайте действия, запускаемые транзакциями, идемпотентными, чтобы второе уведомление не запускало одно и то же действие повторно. Подтверждайте выполнение и попадание в блок с помощью стандартных проверок уровня подтверждения.Пример
Отмена подписки
Чтобы прекратить получать уведомления, вызовитеpreconfUnsubscribe с идентификатором подписки, возвращенным из preconfSubscribe.
Стоимость
Минимум в 300 кредитов за слот вступает в силу 14 октября 2026 года. До
этого момента Preconfirmations оплачиваются по 10 кредитов за сообщение без минимальной суммы.
Минимум рассчитывается отдельно для каждой подписки, поэтому за каждую открытую подписку
preconfSubscribe списывается не менее 300 кредитов за покрытый слот. Закрывайте ненужные подписки с помощью preconfUnsubscribe.
Оплата рассчитывается за каждое сообщение, а не за уникальную подпись. Транзакция, доставленная как Helius, так и BAM, учитывается дважды. Установите includeBam: false, если хотите получать только предварительные подтверждения Helius.
Preconfirmations — новый продукт, и его стоимость может измениться.
Связанные материалы
Preconfirmations Overview
Что такое Preconfirmations и какое место они занимают в конвейере валидатора.
transactionSubscribe
Получайте поток транзакций с уровнем подтверждения confirmed и расширенной фильтрацией.
preconfSubscribe API reference
Параметры запроса, поля фильтра и структура двоичного уведомления.