Skip to main content
Используйте Sender Max (минимальные чаевые: 0,001 SOL), чтобы реагировать на Preconfirmations. Предварительное подтверждение приносит пользу, только если ваша транзакция попадает в блок первой — Sender Max позволяет сделать это быстрее всего. Используйте Sender Max с самого начала, чтобы получить все преимущества Preconfirmations.

Что такое 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 элементами.
Чтобы получать только предварительные подтверждения Helius:

Фильтрация по подписанту и подписи

Используйте signerInclude, чтобы находить транзакции, подписанные определенной учетной записью. Используйте signerExclude, чтобы исключать транзакции, подписанные любой из перечисленных учетных записей. Учетная запись, на которую ссылается транзакция, не считается подписантом. Используйте signatures, если вы уже знаете, какие транзакции хотите отслеживать. Фильтр сопоставляет первую подпись транзакции — именно эту подпись используют методы Solana RPC. После оформления подписки фильтр изменить нельзя, поэтому для отслеживания новых подписей создайте новую подписку.

Фильтрация инструкций

Используйте instructions, чтобы сопоставлять инструкции верхнего уровня по программе и данным инструкции. Каждый фильтр инструкций поддерживает следующие поля: Каждый элемент memcmp принимает кодировку base58, base64 или hex. По умолчанию используется base58. Транзакция соответствует фильтру, если одна инструкция верхнего уровня удовлетворяет всем условиям любого фильтра инструкций. Следующий запрос сопоставляет инструкции pump.fun buy по их дискриминатору Anchor:
Фильтр проверяет только инструкции верхнего уровня. Он не может сопоставлять инструкции, вызываемые посредством межпрограммного вызова (CPI), поскольку до выполнения этих инструкций не существует. Можно указать до 16 фильтров инструкций и до четырех элементов memcmp на каждый фильтр инструкций. Каждое значение memcmp должно декодироваться в последовательность длиной от 1 до 128 байт. Конечное смещение memcmp и dataSize не должны превышать 4 096 байт.

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

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

Фильтрация по местоположению

Используйте regionInclude, чтобы получать только транзакции, поступающие из определенных регионов. Передайте один или несколько кодов регионов; транзакция проходит фильтр, если регион ее происхождения соответствует любому из них.
Регион происхождения зависит от источника. Для предварительных подтверждений Helius это регион Helius, который принял транзакцию. Для предварительных подтверждений BAM это региональная конечная точка BAM, отправившая предварительное подтверждение, а не место, где его принял Helius. Конечные точки BAM в Сингапуре и Далласе соответствуют 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, для которого статус выполнения был недоступен.
Других различающих полей нет. Идентификатор последовательности и позиция в пакете BAM не передаются в этом потоке, поэтому метаданные порядка BAM, которые можно было бы использовать в качестве ключа, отсутствуют. regionInclude — это фильтр подписки, а не поле полезной нагрузки, поэтому его нельзя прочитать для отдельного сообщения. Если требуется, чтобы каждое сообщение в потоке содержало свидетельство одного типа, задайте includeBam: false — в потоке останутся только предварительные подтверждения Helius, отправляемые во время выполнения лидером. Фильтра только для BAM нет.
Всегда сначала считывайте и проверяйте байт version. Сейчас он равен 1. Если Helius потребуется обновить формат полезной нагрузки, номер версии увеличится — выполняйте ветвление по нему, чтобы декодер продолжал работать после изменений схемы.
Предварительное подтверждение — это ранний сигнал, а не гарантия. Транзакция еще не попала в блокчейн и все еще может быть исключена, а статус выполнения в предварительном подтверждении 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.

Дублирующиеся уведомления

Предварительные подтверждения Helius и BAM дедуплицируются отдельно для каждого источника, но не между источниками. Небольшая доля транзакций поступает в Helius обоими способами, поэтому одну и ту же подпись можно получить дважды, причем две копии могут указывать разные слоты. Выполняйте дедупликацию по подписи на стороне клиента и сделайте действия, запускаемые транзакциями, идемпотентными, чтобы второе уведомление не запускало одно и то же действие повторно. Подтверждайте выполнение и попадание в блок с помощью стандартных проверок уровня подтверждения.

Пример

Отмена подписки

Чтобы прекратить получать уведомления, вызовите preconfUnsubscribe с идентификатором подписки, возвращенным из preconfSubscribe.

Стоимость

Минимум в 300 кредитов за слот вступает в силу 14 октября 2026 года. До этого момента Preconfirmations оплачиваются по 10 кредитов за сообщение без минимальной суммы.
Для использования Preconfirmations требуется тариф Professional или выше. Стоимость составляет 10 кредитов за сообщение, при этом для каждой подписки действует минимум 300 кредитов за слот, списываемых с вашего тарифа. Подробнее см. в разделе Кредиты. Минимальная сумма применяется только к слотам с покрытием предварительных подтверждений. В каждом покрытом слоте за подписку списывается большая из двух сумм: 10 кредитов за каждое доставленное сообщение или 300 кредитов. Слоты без покрытия не оплачиваются. В разделе Стоимость указано, какие слоты учитываются при расчете минимума. Минимум рассчитывается отдельно для каждой подписки, поэтому за каждую открытую подписку preconfSubscribe списывается не менее 300 кредитов за покрытый слот. Закрывайте ненужные подписки с помощью preconfUnsubscribe. Оплата рассчитывается за каждое сообщение, а не за уникальную подпись. Транзакция, доставленная как Helius, так и BAM, учитывается дважды. Установите includeBam: false, если хотите получать только предварительные подтверждения Helius.
Preconfirmations — новый продукт, и его стоимость может измениться.

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

Preconfirmations Overview

Что такое Preconfirmations и какое место они занимают в конвейере валидатора.

transactionSubscribe

Получайте поток транзакций с уровнем подтверждения confirmed и расширенной фильтрацией.

preconfSubscribe API reference

Параметры запроса, поля фильтра и структура двоичного уведомления.