Skip to main content
LaserStream предоставляет точно такие же гарантии доставки, как и узлы Geyser. В этом руководстве описано, чего следует ожидать от доставки сообщений в потоках LaserStream.
Эти гарантии распространяются на стандартные подписки (транзакции, аккаунты, слоты, блоки). Предварительно обработанные транзакции (часть Shred Delivery) предоставляются с отдельными гарантиями доставки по мере возможности.

Доставка ровно один раз

LaserStream гарантирует доставку ровно один раз. Каждое сообщение доставляется в ваш поток строго один раз — вы никогда не получите дубликаты, и ни одно сообщение не будет пропущено. Для этого LaserStream одновременно подключается к нескольким узлам Solana и удаляет дубликаты входящих данных перед их передачей в ваш поток. Такая многоузловая архитектура также устраняет единые точки отказа, обеспечивая максимальную доступность без ущерба для корректности доставки.

Порядок сообщений по уровню подтверждения

Порядок доставки зависит от уровня подтверждения сообщений:

Confirmed и finalized

Все сообщения с уровнем confirmed и finalized доставляются по порядку. Эти уровни подтверждения обеспечивают согласованное последовательное представление состояния блокчейна.

Processed

Все сообщения с уровнем processed отправляются в порядке возрастания слотов, если не возникает форк. При форке порядок слотов может временно нарушиться, пока сеть реорганизуется вокруг канонической цепочки. После разрешения форка порядок по возрастанию восстанавливается.
На уровне подтверждения processed существует небольшая вероятность, что обработанный слот позднее будет пропущен или отброшен из-за форка. Geyser не отправляет явные уведомления об откате для обновлений, отброшенных из-за форка. Если ваше приложение получает данные уровня processed, необходимо учитывать, что некоторые обновления могут относиться к слотам, которые в итоге будут исключены. Для приложений, которым требуется определенность, используйте уровень подтверждения confirmed или finalized.

Порядок внутри слота

В пределах одного слота LaserStream доставляет обновления аккаунтов и транзакции со следующими гарантиями:

Обновления аккаунтов перед транзакциями

Для каждой транзакции вызванные ею обновления аккаунтов доставляются до самой транзакции:

Порядок между транзакциями

LaserStream сохраняет тот же порядок, что и плагин Geyser для Agave. Детерминированность порядка поступления обновлений от разных транзакций зависит от их блокировок записи:
  • Одинаковая блокировка записи (например, три сделки в одном пуле Raydium): порядок всегда детерминирован. Agave выполняет такие транзакции последовательно, поскольку они записывают данные в один и тот же аккаунт.
  • Разные блокировки записи (например, две не связанные между собой транзакции): порядок не обязательно детерминирован. Agave может выполнять их параллельно, поэтому их обновления могут чередоваться в потоке.
Чтобы восстановить полностью детерминированный порядок независимо от блокировок записи, используйте индекс блока/транзакции из данных транзакции.

Нормализация версий записи

LaserStream нормализует версии записи в своей многоузловой архитектуре. В отличие от необработанных данных Geyser или Yellowstone, где версии записи локальны для каждого узла и могут различаться, LaserStream предоставляет согласованные версии записи, на которые можно полагаться при упорядочивании обновлений аккаунтов уровня processed.
Временное исключение: аккаунты размером более 512 КБ сейчас буферизуются в плагине Geyser из соображений производительности, что может влиять на детерминированность порядка для этих аккаунтов. Это ограничение будет устранено в ближайшее время.

Уведомления о слотах

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

Непрерывность данных при отключении

LaserStream хранит буфер с данными последних слотов, обеспечивая воспроизведение исторических данных за период до 48 часов (около 691 200 слотов при текущей скорости сети). Если ваше приложение отключится, можно повторно подключиться и продолжить работу с последнего обработанного слота без потери данных. При использовании клиента SDK LaserStream восстановление выполняется автоматически: клиент отслеживает позицию в потоке по номеру слота и повторно подключается без прерываний. Реализовывать логику повторного подключения вручную не требуется.

Справочник уровней подтверждения