transaction v1 の変更点
レガシーおよび v0 トランザクションは変更されません。ほとんどの統合において、transaction v1 に関して重要なのは次の2点です:- 受け取るにはオプトインが必要です。 完全なトランザクションデータを要求する場合は
maxSupportedTransactionVersion: 1が必要で、クライアントライブラリも v1 を逆シリアル化できるバージョンが必要です。 - 計算予算がメッセージヘッダに移動します。 v1 メッセージは、
transactionConfigオブジェクトを持ち、computeUnitLimit、heapSize、loadedAccountsDataSizeLimit、およびpriorityFeeを含みます。v1 トランザクションには ComputeBudget プログラム指令がありません。
"version": 1 を報告し、その message に transactionConfig が含まれます:
"priorityFee": 50000 は、このトランザクションが合計 50,000 ラムポーツを支払うことを意味します。null フィールドは、送信者がそれを設定していないことを意味します。レガシーおよび v0 メッセージは transactionConfig を完全に省略します。
maxSupportedTransactionVersion を 1 に設定する
完全なトランザクションデータを返すすべてのリクエストは、処理できる最大のトランザクションバージョンを宣言する必要があります。次でmaxSupportedTransactionVersion: 1 を設定します:
getTransactiongetBlockgetTransactionsForAddresswithtransactionDetails: "full"transactionSubscribewithtransactionDetails: "accounts"or"full"blockSubscribe
0 に設定すると、v1 トランザクションにアクセスした時点で JSON-RPC エラー -32015 が発生して失敗します:
getBlock の場合、ブロック内の v1 トランザクションが1つでもあればそのリクエスト全体が失敗します。ログに -32015 が表示されている場合、そのプロジェクトは既にバージョン付きトランザクションで失敗しています。
値を上げる前に SDK をアップグレードする
maxSupportedTransactionVersion: 1 を設定すると、ノードが v1 トランザクションを返すように指示します。しかし、クライアントライブラリはそれを逆シリアル化する必要があります。まずアップグレードしてから、パラメータを変更します:
古い
VersionedTransaction.deserialize の JavaScript 実装は、レガシーと v0 のみを処理し、先頭の 0x81 バイトでエラーを投げます。古い Yellowstone プロトタイプは v1 メッセージフィールドの前に作られているため、これらのバージョンの gRPC コンシューマは transactionConfig を確認しません。Go gRPC クライアントでは、最新の Yellowstone プロトタイプから再生成し、solana-storage-proto します。
transactionConfig からプライオリティ手数料を読み取る
ComputeBudget プログラム指令 (ComputeBudget111111111111111111111111111111, setComputeUnitPrice, setComputeUnitLimit) をスキャンしてトランザクションのプライオリティ手数料を推定するコードは、v1 トランザクションをすべて手数料がゼロであると見なします。v1 では値は message.transactionConfig に存在し、単位は異なります:
レガシーの
price × computeUnitLimit ÷ 1e6 数学を priorityFee に移植しないでください。それはすでに合計です。
priority-fee.ts
transactionConfig(または version === 1)に基づいて分岐します。プライオリティ手数料のないレガシートランザクションも指令がないからです。
v1-aware parser で生トランザクションバイトをデコードする
このセクションは、生トランザクションバイトを使用する場合にのみ該当します。例えば、preconfSubscribe や preprocessedSubscribe、またはbase64 でエンコードされた RPC 応答から受け取る場合です。json や jsonParsed 応答を使用する場合は、これをスキップします。
トランザクション v1 は、ワイヤレイアウトを2つの方法で変更します。
- バージョンバイト。 v1 トランザクションは
0x81(十進数 129)で始まります。v0 トランザクションは0x80で始まります。 - 署名が末尾に移動します。 レガシーおよび v0 は最初に署名があり、その後メッセージがあります。トランザクション v1 はメッセージを先にして署名を最後にするため、署名配列を先頭に期待する
bincodeスタイルのデコーダは v1 バイトで失敗します。

3つのアドレスと1つの指令を持つトランザクション v1 のバイトレイアウト。署名はメッセージの後に末尾にあります。
- Rust:
agave-transaction-viewは、レガシー、v0、および v1 の場所で解析します。wincode、現在のSolana SDKで使用されるバイナリー互換のシリアライザは、VersionedTransactionにデコードします。 - JavaScript / TypeScript:
@solana/kit8.0+ または@solana/web3.jsv3。
0x81 は v1 を意味し、署名がメッセージの後に続くことを示します。
チェックリスト
getBlock、getTransaction、getTransactionsForAddress、transactionSubscribe、blockSubscribeを grep し、生の JSON-RPC 本体やconnection.getParsedTransactionなどの SDK ラッパーを含める。- v1 に対応した SDK にアップグレードする。
- ステップ1で見つかったすべての呼び出しに
maxSupportedTransactionVersion: 1を設定する。 - ComputeBudget 命令スキャンをやめ、
transactionConfigチェックに置き換え、priorityFeeを総ラムポーツとして扱う。 bincodeスタイルの生デコーダをagave-transaction-viewまたはアップグレードした SDK に置き換える。- ストリーミング依存関係を上記の表のバージョンにバンプする。
- 変更後に inline_code_placeholder_d5454a928a6e3cfa_END がログに表示されないことを確認するためにログを grep する。
関連
getTransaction guide
単一のトランザクションを取得するためのパラメータ、応答形式、例。
getBlock guide
含まれるすべてのトランザクションを含むフルブロックを取得する。
getTransactionsForAddress
アドレスごとのフィルタリング済み、ページネーションされたトランザクション履歴を一度の呼び出しで取得する。
Agave 4.2 migration checklist
Agave 4.2 のすべての破壊的変更と修正手順。