What is a serialized Solana transaction?
A serialized Solana transaction is a compact byte array: a count-prefixed list of 64-byte ed25519 signatures followed by the message, which holds a header (number of signers and read-only accounts), the account addresses as 32-byte keys, a recent blockhash and the instructions, each referencing its program and accounts by index. Wallets and RPC nodes exchange it as base64 or base58; the first signature doubles as the transaction ID.
Reading the result
- Accounts are listed in message order: signers first, then writable, then read-only. The fee payer is account 0.
- Instructions show the program, the decoded name and fields, and under "Accounts and data" the exact account list and data bytes.
- Transfers at the top summarise what moves: SOL via the System Program and tokens via Transfer / TransferChecked.
Legacy vs. versioned (v0) messages
| Property | Legacy | v0 (versioned) |
|---|---|---|
| Message prefix | none; starts with the header | 0x80 version byte before the header |
| Accounts | all listed inline, up to the 1232-byte limit | inline plus indexes into address lookup tables |
| Resolvable offline | yes, every account is in the message | lookup-table entries need on-chain data |
| Typical producers | simple wallets, older SDKs | DEX aggregators, anything with many accounts |
Worked example
A SOL transfer message has 3 accounts: the sender (signer, writable), the recipient (writable) and the System Program 11111111111111111111111111111111. Its single instruction points at account index 2 with data 02000000 (instruction 2 = Transfer, as a little-endian u32) followed by the amount as a little-endian u64, so 00e1f50500000000 is 100,000,000 lamports = 0.1 SOL. A USDC transfer instead targets the Token program with a TransferChecked instruction carrying the amount and decimals = 6.
Checking a wallet prompt
When a dApp requests a signature, wallets often display a simulation. If you want the ground truth, log the serialized message from the dApp (most libraries expose transaction.serialize({ requireAllSignatures: false })) and paste it here: you will see every instruction, including Compute Budget settings and any SetAuthority or Approve that a simulation summary might hide.
Related: Solana address validator, lamports converter, devnet batch transfer.