シリアライズされた Solana トランザクションとは
シリアライズされた Solana トランザクションはコンパクトなバイト配列です。個数プレフィックス付きの 64 バイト ed25519 署名のリストの後にメッセージが続き、メッセージにはヘッダー(署名者数と読み取り専用アカウント数)、32 バイト鍵としてのアカウントアドレス、最近の blockhash、そしてプログラムとアカウントをインデックスで参照する命令が含まれます。ウォレットと RPC ノードはこれを base64 または base58 でやり取りし、最初の署名がトランザクション ID を兼ねます。
結果の読み方
- アカウントはメッセージ内の順序で表示されます: 署名者、次に書き込み可能、次に読み取り専用。fee payer はアカウント 0 です。
- 命令にはプログラム、デコードされた名前とフィールド、そして「Accounts and data」の下に正確なアカウントリストとデータバイトが表示されます。
- 先頭の送金は何が移動するかを要約します: System Program 経由の SOL と、Transfer / TransferChecked 経由のトークン。
Legacy メッセージと versioned(v0)メッセージ
| 項目 | Legacy | v0(versioned) |
|---|---|---|
| メッセージのプレフィックス | なし。ヘッダーから始まる | ヘッダーの前に 0x80 のバージョンバイト |
| アカウント | すべてインラインで列挙、1232 バイト制限まで | インラインに加え、アドレスルックアップテーブルへのインデックス |
| オフラインで解決可能か | はい。すべてのアカウントがメッセージ内にある | ルックアップテーブルのエントリにはオンチェーンデータが必要 |
| 主な生成元 | シンプルなウォレット、古い SDK | DEX アグリゲーターなど、多数のアカウントを扱うもの |
具体例
SOL 送金のメッセージには 3 つのアカウントがあります: 送信者(署名者、書き込み可能)、受取先(書き込み可能)、System Program 11111111111111111111111111111111。唯一の命令はアカウントインデックス 2 を指し、データは 02000000(リトルエンディアン u32 の命令 2 = Transfer)に続けてリトルエンディアン u64 の金額なので、00e1f50500000000 は 100,000,000 lamports = 0.1 SOL です。USDC 送金は代わりに Token プログラムを対象とし、金額と decimals = 6 を持つ TransferChecked 命令になります。
ウォレットのプロンプトを確認する
dApp が署名を要求すると、ウォレットはシミュレーションを表示することがよくあります。本当のところを知りたければ、dApp からシリアライズされたメッセージをログ出力し(ほとんどのライブラリは transaction.serialize({ requireAllSignatures: false }) を公開しています)、ここに貼り付けてください。Compute Budget の設定や、シミュレーションの要約では隠れがちな SetAuthority や Approve を含め、すべての命令が表示されます。