Что такое сериализованная транзакция Solana?
Сериализованная транзакция Solana — это компактный массив байт: список 64-байтных подписей ed25519 с префиксом-счётчиком, за которым следует сообщение, содержащее заголовок (число подписантов и аккаунтов только для чтения), адреса аккаунтов как 32-байтные ключи, недавний blockhash и инструкции, каждая из которых ссылается на программу и аккаунты по индексу. Кошельки и RPC-узлы обмениваются им в base64 или base58; первая подпись одновременно служит ID транзакции.
Как читать результат
- Аккаунты перечислены в порядке сообщения: сначала подписанты, затем записываемые, затем только для чтения. Плательщик комиссии — аккаунт 0.
- Инструкции показывают программу, декодированное имя и поля, а в разделе «Аккаунты и данные» — точный список аккаунтов и байты данных.
- Переводы вверху сводят, что перемещается: SOL через System Program и токены через Transfer / TransferChecked.
Legacy и версионированные (v0) сообщения
| Свойство | Legacy | v0 (версионированное) |
|---|---|---|
| Префикс сообщения | нет; начинается с заголовка | байт версии 0x80 перед заголовком |
| Аккаунты | все перечислены inline, до лимита 1232 байта | inline плюс индексы в таблицах поиска адресов |
| Разрешается офлайн | да, каждый аккаунт есть в сообщении | записям таблиц поиска нужны данные из сети |
| Типичные источники | простые кошельки, старые SDK | DEX-агрегаторы, всё с большим числом аккаунтов |
Наглядный пример
Сообщение перевода 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.