Skip to main content

Что такое бандл

Бандл представляет собой группу от 1 до 4 транзакций, которые исполняются по порядку и по принципу «всё или ничего». Либо все транзакции бандла попадают в один блок в заданном вами порядке, либо не попадает ни одна. Используйте бандл, когда более поздняя транзакция имеет смысл только при успехе более ранней, например подготовительная транзакция, за которой следует своп.
Бандлы попадают в блок только у лидеров с поддержкой Jito. Группу транзакций невозможно сохранить атомарной на путях с весом по стейку и прямого TPU, поэтому бандлы идут только по пути block engine. Когда текущий лидер не использует Jito, бандл ждёт следующего, который использует. Для одиночной транзакции обычная отправка использует все три пути и попадает в блок быстрее.

Правила

Чаевые подчиняются тому же правилу чаевых, что и одиночная отправка: один перевод SystemProgram верхнего уровня на опубликованный аккаунт для чаевых, оплаченный подписантом, с аккаунтом для чаевых в статических ключах. Эти чаевые за вычетом базовой комиссии 5,000 lamports становятся ставкой Jito за весь бандл. Поскольку бандл атомарен, чаевые выплачиваются, только если в блок попал весь бандл.

JSON-RPC sendBundle

Результатом является идентификатор бандла. Сохраните его, чтобы запрашивать статус бандла. sendBundle также принимает {"encoding": "base58"} для транзакций в кодировке base58. Примеры ниже используют base64.
Примеры на JavaScript и Python импортируют хелпер из раздела Отправка транзакций. Ответ:

POST /send-bundle

Бинарный маршрут принимает тот же формат фреймов, что и /send-batch: для каждой транзакции длина u16 в big-endian и следующие за ней сырые байты транзакции, от 1 до 4 фреймов в порядке исполнения.
Ответ:
Ошибки используют тот же формат и те же коды статуса, что и остальные простые HTTP-маршруты. Бандл, отклонённый целиком, возвращается с меткой bundle.

Отслеживание бандла

Вызовите getInflightBundleStatuses с массивом идентификаторов бандлов:
Результат содержит по одной записи на каждый идентификатор бандла в порядке запроса:
landed_slot содержит слот, в который попал бандл, или null, если он ещё не попал в блок. status принимает одно из четырёх состояний: Идентификатор бандла не меняется, пока Apex отправляет его повторно, поэтому продолжайте опрашивать тот идентификатор, который получили при отправке. Обращайтесь к тому же эндпоинту Apex, на который вы отправили бандл. Идентификаторы бандлов не разделяются между эндпоинтами. Поскольку бандл атомарен, вы также можете подтвердить его как любую транзакцию: как только любая из его подписей появляется как подтверждённая в getSignatureStatuses на Solana RPC, весь бандл попал в блок.

Бандл или пакет?