Skip to main content
Agave 4.2 は transaction v1 を導入します (SIMD-0385)。この機能がメインネットで有効になると、ウォレットやプログラムは v1 トランザクションの送信を開始し、完全なトランザクションデータを取得するすべてのリクエストは、それを受け取るためのオプトインが必要になります。 このページでは、何が変わるのか、影響を受ける Helius エンドポイント、およびコードの更新方法について説明します。報酬タイプ、アカウント更新の意味論、スロットタイミングを含む完全な Agave 4.2 チェックリストについては、Agave 4.2 移行チェックリストを参照してください。

transaction v1 の変更点

レガシーおよび v0 トランザクションは変更されません。ほとんどの統合において、transaction v1 に関して重要なのは次の2点です:
  • 受け取るにはオプトインが必要です。 完全なトランザクションデータを要求する場合は maxSupportedTransactionVersion: 1 が必要で、クライアントライブラリも v1 を逆シリアル化できるバージョンが必要です。
  • 計算予算がメッセージヘッダに移動します。 v1 メッセージは、transactionConfig オブジェクトを持ち、computeUnitLimitheapSizeloadedAccountsDataSizeLimit、および priorityFee を含みます。v1 トランザクションには ComputeBudget プログラム指令がありません。
ワイヤフォーマットも変わります(新しいバージョンバイトとトランザクション末尾の署名)、ただしこれは生のトランザクションバイトをデコードするコードにのみ影響します。詳細は下記のDecode raw transaction bytes を参照してください。 JSON 応答では、v1 トランザクションは "version": 1 を報告し、その messagetransactionConfig が含まれます:
"priorityFee": 50000 は、このトランザクションが合計 50,000 ラムポーツを支払うことを意味します。null フィールドは、送信者がそれを設定していないことを意味します。レガシーおよび v0 メッセージは transactionConfig を完全に省略します。

maxSupportedTransactionVersion を 1 に設定する

完全なトランザクションデータを返すすべてのリクエストは、処理できる最大のトランザクションバージョンを宣言する必要があります。次で maxSupportedTransactionVersion: 1 を設定します: パラメータを省略するか、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
ComputeBudget 指令の有無ではなく、transactionConfig(または version === 1)に基づいて分岐します。プライオリティ手数料のないレガシートランザクションも指令がないからです。

v1-aware parser で生トランザクションバイトをデコードする

このセクションは、生トランザクションバイトを使用する場合にのみ該当します。例えば、preconfSubscribepreprocessedSubscribe、または base64 でエンコードされた RPC 応答から受け取る場合です。jsonjsonParsed 応答を使用する場合は、これをスキップします。 トランザクション v1 は、ワイヤレイアウトを2つの方法で変更します。
  • バージョンバイト。 v1 トランザクションは 0x81(十進数 129)で始まります。v0 トランザクションは 0x80 で始まります。
  • 署名が末尾に移動します。 レガシーおよび v0 は最初に署名があり、その後メッセージがあります。トランザクション v1 はメッセージを先にして署名を最後にするため、署名配列を先頭に期待する bincode スタイルのデコーダは v1 バイトで失敗します。
Solana トランザクション v1 のバイト単位のレイアウト: バージョンバイト、ヘッダー、構成マスク、寿命指定子、アドレスと指令カウント、3つの32バイトアドレス、計算単位構成、指令ヘッダー、インデックス、識別子、ラムポーツ、および末尾の64バイト署名

3つのアドレスと1つの指令を持つトランザクション v1 のバイトレイアウト。署名はメッセージの後に末尾にあります。

v1 ワイヤフォーマットのフィールドごとの解説は、Transaction v1 in the Solana transaction versions article を参照してください。 v1 レイアウトを理解するデコーダを使用します:
  • Rust: agave-transaction-view は、レガシー、v0、および v1 の場所で解析します。wincode、現在のSolana SDKで使用されるバイナリー互換のシリアライザは、VersionedTransactionにデコードします。
  • JavaScript / TypeScript: @solana/kit 8.0+ または @solana/web3.js v3。
カスタムデコーダでは最初のバイトをチェックする必要があります: 0x81 は v1 を意味し、署名がメッセージの後に続くことを示します。

チェックリスト

  1. getBlockgetTransactiongetTransactionsForAddresstransactionSubscribeblockSubscribe を grep し、生の JSON-RPC 本体や connection.getParsedTransaction などの SDK ラッパーを含める。
  2. v1 に対応した SDK にアップグレードする。
  3. ステップ1で見つかったすべての呼び出しに maxSupportedTransactionVersion: 1 を設定する。
  4. ComputeBudget 命令スキャンをやめ、transactionConfig チェックに置き換え、priorityFee を総ラムポーツとして扱う。
  5. bincode スタイルの生デコーダを agave-transaction-view またはアップグレードした SDK に置き換える。
  6. ストリーミング依存関係を上記の表のバージョンにバンプする。
  7. 変更後に inline_code_placeholder_d5454a928a6e3cfa_END がログに表示されないことを確認するためにログを grep する。
Solana トランザクションバージョン仕様、ワイヤフォーマット、および例についての技術的な詳細は、Solana Transaction Versioning: Legacy, v0 and v1 をお読みください。

関連

getTransaction guide

単一のトランザクションを取得するためのパラメータ、応答形式、例。

getBlock guide

含まれるすべてのトランザクションを含むフルブロックを取得する。

getTransactionsForAddress

アドレスごとのフィルタリング済み、ページネーションされたトランザクション履歴を一度の呼び出しで取得する。

Agave 4.2 migration checklist

Agave 4.2 のすべての破壊的変更と修正手順。