ГЛАВНАЯ / ИНСТРУКЦИИ / ТРАНЗАКЦИИ SOLANA LEGACY, V0 И V1: ФОРМАТЫ СООБЩЕНИЯ И ADDRESS LOOKUP TABLE
Транзакции Solana legacy, v0 и v1: форматы сообщения и Address Lookup Table
В Solana сосуществуют legacy, v0 и v1. Формат v0 добавляет Address Lookup Tables (ALT), чтобы передавать часть адресов через однобайтовые индексы. По актуальной документации Solana, v1 активен в кластерах, увеличивает лимит размера и задаёт часть ресурсов в сообщении, но ALT не использует. Поэтому парсеру недостаточно считать каждую versioned transaction сообщением v0.
Legacy, v0 и v1 задают разные правила сериализации
Legacy использует компактный исторический формат без version prefix. V0 – версионированное сообщение, где перечень аккаунтов может включать Address Lookup Tables. V1 вводит отдельную структуру и конфигурацию ресурсов. Текущая официальная документация отмечает v1 как активный в mainnet, devnet и testnet, но отправка v1 остаётся выбором приложения и требует совместимых библиотек, сериализаторов и RPC-клиентов.
Не делайте вывод о версии только по тому, что API вернул объект VersionedTransaction. При декодировании проверяйте prefix и поддерживаемую библиотекой схему. Устаревший индексатор может понять заголовок, но неверно прочитать смещения и тем самым исказить ключи, инструкции или поля конфигурации.
- legacy, v0 и v1 декодируются отдельно
- ALT разрешается только для v0
- v1 config прочитан по его схеме
ALT сокращает сообщение через индексы, а не меняет адреса аккаунтов
В v0 сообщение содержит статические ключи и ссылки на таблицы адресов. Lookup описывает адрес ALT и набор индексов для writable и readonly адресов. Runtime разрешает индексы по данным таблицы перед исполнением. Каждый индекс занимает меньше места, чем полный ключ, поэтому формат может вместить больше адресов в ограниченный сетевой пакет.
ALT не превращает адреса в подписи и не меняет владельцев аккаунтов. Подписанты, включая fee payer, должны оставаться в static account keys. При разборе результата getTransaction учитывайте раздельные addressTableLookups и загруженные writable/readonly addresses; нельзя механически применить индекс к общему списку без соблюдения порядка разрешения.
- статические ключи отделены от загруженных
- индексы ALT сопоставлены в правильном порядке
- fee payer и подписанты остались статическими
V1 увеличивает размер сообщения и убирает ALT из формата
Согласно актуальным Solana docs, для v1 установлен предел 4096 байт, тогда как legacy и v0 ограничены 1232 байтами. V1 не использует Address Lookup Tables: адреса передаются inline. Его transaction config несёт ограничения ресурсов непосредственно в сообщении вместо старого способа извлечения конфигурации из ComputeBudget-инструкций. При чтении транзакции эти поля надо разбирать по спецификации версии, а не по правилам v0.
Активность версии в сети не означает, что любая версия SDK готова её создать или прочитать. Уточняйте поддержку отправителя, RPC-провайдера, архивного узла и аналитического конвейера. В частности, v1 требует явной поддержки и параметра версии в запросах, возвращающих транзакции или блоки.
Задайте максимальную поддерживаемую версию во всех чтениях
Для getTransaction и getBlock укажите maxSupportedTransactionVersion с максимальной версией, которую действительно умеет ваш потребитель. Текущая документация включает значение 1 для чтения v1. Если не указать допустимую версию или оставить поддержку на 0, запрос может завершиться ошибкой при встрече более новой транзакции.
Проверьте не только HTTP RPC, но и WebSocket-подписки, блок-стримы, сырые декодеры и хранилища схем. При миграции добавьте тесты на legacy, v0 с ALT и v1, включая корректное разрешение ключей, signatures, fee payer и конфигурации. Наличие ответа от RPC ещё не гарантирует, что ваша downstream-система правильно интерпретировала его.
- maxSupportedTransactionVersion соответствует клиенту
- RPC и SDK поддерживают заявленную версию
- downstream-декодер покрывает все форматы
Частые вопросы
V1 – это другое название v0?
Нет. Это отдельный формат с иным сообщением и конфигурацией ресурсов.
В v1 есть Address Lookup Tables?
Нет. В официально описанном v1 адреса передаются inline; ALT применяется в v0.
Можно считать любой versioned transaction форматом v0?
Нет. Парсер должен различать версии и поддерживать каждую заявленную схему.
Нужно ли указывать maxSupportedTransactionVersion?
Да, чтения getTransaction/getBlock должны объявить наибольшую реально поддерживаемую версию.
Активность v1 гарантирует поддержку SDK?
Нет. Поддержку надо проверить для используемых SDK, RPC и downstream-парсера.
Чек-лист: транзакции solana legacy, v0 и v1: форматы сообщения и address lookup table
- формат определён из фактических байтов сообщения;
- v0 и v1 разбираются разными правилами;
- ALT применяется только там, где версия её поддерживает;
- writable и readonly ключи разрешены в правильном порядке;
- подписанты и fee payer найдены среди статических ключей;
- RPC-запрос объявляет поддерживаемую версию;
- проверены SDK, провайдер и все потребители транзакций.
Материал подготовлен редакцией сайта и проверен 7 ноября 2026 года. Условия бирж, кошельков и блокчейн-сетей могут меняться. Перед операцией сверяйте данные в интерфейсе выбранного сервиса.