Декодер транзакций Solana

Вставьте base64, который кошелёк просит вас подписать, или строку, которую возвращает RPC. Декодер перечисляет подписантов, аккаунты и инструкции, называет распространённые программы и сводит переводы SOL и токенов.

Подписанная или неподписанная. Декодирование выполняется в вашем браузере; никуда ничего не отправляется, поэтому это безопасно для неподписанных транзакций, которые вы собираетесь подписать.
Примеры:

Декодируется в вашем браузере на JavaScript. Адреса никогда не загружаются на сервер и не сохраняются.

Что такое сериализованная транзакция Solana?

Сериализованная транзакция Solana — это компактный массив байт: список 64-байтных подписей ed25519 с префиксом-счётчиком, за которым следует сообщение, содержащее заголовок (число подписантов и аккаунтов только для чтения), адреса аккаунтов как 32-байтные ключи, недавний blockhash и инструкции, каждая из которых ссылается на программу и аккаунты по индексу. Кошельки и RPC-узлы обмениваются им в base64 или base58; первая подпись одновременно служит ID транзакции.

Как читать результат

Legacy и версионированные (v0) сообщения

СвойствоLegacyv0 (версионированное)
Префикс сообщениянет; начинается с заголовкабайт версии 0x80 перед заголовком
Аккаунтывсе перечислены inline, до лимита 1232 байтаinline плюс индексы в таблицах поиска адресов
Разрешается офлайнда, каждый аккаунт есть в сообщениизаписям таблиц поиска нужны данные из сети
Типичные источникипростые кошельки, старые SDKDEX-агрегаторы, всё с большим числом аккаунтов

Наглядный пример

Сообщение перевода SOL содержит 3 аккаунта: отправитель (подписант, записываемый), получатель (записываемый) и System Program 11111111111111111111111111111111. Его единственная инструкция указывает на аккаунт с индексом 2 с данными 02000000 (инструкция 2 = Transfer, как little-endian u32), за которыми идёт сумма как little-endian u64, так что 00e1f50500000000 — это 100 000 000 lamports = 0,1 SOL. Перевод USDC вместо этого обращается к программе Token с инструкцией TransferChecked, несущей сумму и decimals = 6.

Проверка запроса кошелька

Когда dApp запрашивает подпись, кошельки часто показывают симуляцию. Если нужна истина, залогируйте сериализованное сообщение из dApp (большинство библиотек предоставляют transaction.serialize({ requireAllSignatures: false })) и вставьте его сюда: вы увидите каждую инструкцию, включая настройки Compute Budget и любые SetAuthority или Approve, которые сводка симуляции может скрыть.

См. также: валидатор Solana-адресов, конвертер lamports, пакетный перевод в devnet.

Часто задаваемые вопросы

Какие форматы работают?

Base64 из getTransaction с кодировкой base64, из signTransaction кошелька или из Transaction.serialize(); base58, как в sendTransaction; сырой hex. Голое сообщение (без массива подписей) тоже принимается — именно его некоторые кошельки показывают перед подписанием.

Что такое транзакция v0?

Версионированные транзакции (v0) могут ссылаться на аккаунты, хранящиеся в таблицах поиска адресов, чтобы уместить больше аккаунтов в лимит 1232 байта. Декодер показывает адреса таблиц и индексы, но сами аккаунты за ними живут в сети и не могут быть разрешены офлайн; они отображаются как 'lookup-table account #n'.

Подпись транзакции — это то же, что хеш?

В Solana первая подпись служит ID транзакции. Она показывается, когда слот подписи ненулевой; у неподписанной транзакции ID ещё нет.

Какие инструкции декодируются?

Переводы и создание аккаунтов System Program, переводы, approve, mint, burn и close для SPL Token и Token-2022 (checked-варианты показывают сумму с decimals), создание Associated Token Account, лимиты и цены Compute Budget, а также текст Memo. Другие программы показываются по имени, где оно известно (Jupiter, Raydium, Orca, Metaplex), с сырыми аккаунтами и данными.

Что такое лимит 1232 байта?

Транзакции Solana должны помещаться в один сетевой пакет: 1280 байт MTU IPv6 минус заголовки оставляют 1232 байта для сериализованной транзакции. Каждый аккаунт стоит 32 байта, каждая подпись — 64, поэтому большие транзакции используют таблицы поиска.

Почему для SPL Transfer суммы в сырых единицах?

Обычная инструкция Transfer не несёт decimals, их несёт только TransferChecked. Переведите сырые единицы в конвертере decimals, когда узнаете decimals этого mint.