> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Transaction v1 サポート

> "Solana 統合を transaction v1 に準備しましょう: maxSupportedTransactionVersion を 1 に設定し、v1 に対応した SDK にアップグレードし、transactionConfig からプライオリティ手数料を読み込みます。"

Agave 4.2 は transaction v1 を導入します ([SIMD-0385](https://github.com/solana-foundation/solana-improvement-documents/blob/main/proposals/0385-transaction-v1.md))。この機能がメインネットで有効になると、ウォレットやプログラムは v1 トランザクションの送信を開始し、完全なトランザクションデータを取得するすべてのリクエストは、それを受け取るためのオプトインが必要になります。

このページでは、何が変わるのか、影響を受ける Helius エンドポイント、およびコードの更新方法について説明します。報酬タイプ、アカウント更新の意味論、スロットタイミングを含む完全な Agave 4.2 チェックリストについては、[Agave 4.2 移行チェックリスト](https://www.helius.dev/blog/agave-4-2-migration-checklist)を参照してください。

## transaction v1 の変更点

レガシーおよび v0 トランザクションは変更されません。ほとんどの統合において、transaction v1 に関して重要なのは次の2点です:

* **受け取るにはオプトインが必要です。** 完全なトランザクションデータを要求する場合は `maxSupportedTransactionVersion: 1` が必要で、クライアントライブラリも v1 を逆シリアル化できるバージョンが必要です。
* **計算予算がメッセージヘッダに移動します。** v1 メッセージは、`transactionConfig` オブジェクトを持ち、`computeUnitLimit`、`heapSize`、`loadedAccountsDataSizeLimit`、および `priorityFee` を含みます。v1 トランザクションには ComputeBudget プログラム指令がありません。

ワイヤフォーマットも変わります（新しいバージョンバイトとトランザクション末尾の署名）、ただしこれは生のトランザクションバイトをデコードするコードにのみ影響します。詳細は下記の[Decode raw transaction bytes](#v1-aware-parser-で生トランザクションバイトをデコードする) を参照してください。

JSON 応答では、v1 トランザクションは `"version": 1` を報告し、その `message` に `transactionConfig` が含まれます:

```json theme={"system"}
{
  "version": 1,
  "transaction": {
    "signatures": ["..."],
    "message": {
      "accountKeys": ["..."],
      "instructions": [
        { "programIdIndex": 3, "accounts": [0, 1], "data": "3Bxs4..." }
      ],
      "recentBlockhash": "...",
      "transactionConfig": {
        "computeUnitLimit": 200000,
        "heapSize": null,
        "loadedAccountsDataSizeLimit": 200000,
        "priorityFee": 50000
      }
    }
  }
}
```

`"priorityFee": 50000` は、このトランザクションが合計 50,000 ラムポーツを支払うことを意味します。`null` フィールドは、送信者がそれを設定していないことを意味します。レガシーおよび v0 メッセージは `transactionConfig` を完全に省略します。

## maxSupportedTransactionVersion を 1 に設定する

完全なトランザクションデータを返すすべてのリクエストは、処理できる最大のトランザクションバージョンを宣言する必要があります。次で `maxSupportedTransactionVersion: 1` を設定します:

* [`getTransaction`](/docs/ja/rpc/guides/gettransaction)
* [`getBlock`](/docs/ja/rpc/guides/getblock)
* [`getTransactionsForAddress`](/docs/ja/rpc/gettransactionsforaddress) with `transactionDetails: "full"`
* [`transactionSubscribe`](/docs/ja/rpc/websocket/transaction-subscribe) with `transactionDetails: "accounts"` or `"full"`
* [`blockSubscribe`](/docs/ja/api-reference/rpc/websocket/blocksubscribe)

パラメータを省略するか、`0` に設定すると、v1 トランザクションにアクセスした時点で JSON-RPC エラー `-32015` が発生して失敗します:

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "error": {
    "code": -32015,
    "message": "Transaction version (1) is not supported by the requesting client. Please use \"maxSupportedTransactionVersion\" in your request."
  },
  "id": 1
}
```

`getBlock` の場合、ブロック内の v1 トランザクションが1つでもあればそのリクエスト全体が失敗します。ログに `-32015` が表示されている場合、そのプロジェクトは既にバージョン付きトランザクションで失敗しています。

<CodeGroup>
  ```json getTransaction theme={"system"}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getTransaction",
    "params": [
      "2id3YC2jK9G5Wo2phDx4gJVAew8DcY5NAojnVuao8rkxwPYPe8cSwE5GzhEgJA2y8fVjDEo6iR6ykBvDxrTQrtpb",
      {
        "encoding": "jsonParsed",
        "commitment": "confirmed",
        "maxSupportedTransactionVersion": 1
      }
    ]
  }
  ```

  ```json getBlock theme={"system"}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getBlock",
    "params": [
      341197053,
      {
        "encoding": "jsonParsed",
        "transactionDetails": "full",
        "maxSupportedTransactionVersion": 1
      }
    ]
  }
  ```

  ```json getTransactionsForAddress theme={"system"}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getTransactionsForAddress",
    "params": [
      "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
      {
        "transactionDetails": "full",
        "encoding": "jsonParsed",
        "limit": 100,
        "maxSupportedTransactionVersion": 1
      }
    ]
  }
  ```

  ```json transactionSubscribe theme={"system"}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "transactionSubscribe",
    "params": [
      { "accountInclude": ["86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY"] },
      {
        "commitment": "confirmed",
        "encoding": "jsonParsed",
        "transactionDetails": "full",
        "maxSupportedTransactionVersion": 1
      }
    ]
  }
  ```
</CodeGroup>

## 値を上げる前に SDK をアップグレードする

`maxSupportedTransactionVersion: 1` を設定すると、ノードが v1 トランザクションを返すように指示します。しかし、クライアントライブラリはそれを逆シリアル化する必要があります。まずアップグレードしてから、パラメータを変更します:

| クライアント                                          | transaction v1 サポートのある最小バージョン |
| ----------------------------------------------- | ----------------------------- |
| `@solana/kit`                                   | 8.0                           |
| `@solana/web3.js`                               | v3                            |
| Rust `solana-sdk` / `solana-transaction-status` | Agave 4.2 クレートで構築されたリリース      |
| `yellowstone-grpc-client`                       | 13.3.0                        |
| `yellowstone-grpc-proto`                        | 12.6.0                        |
| `helius-laserstream` (JavaScript)               | 0.8.4                         |
| `helius-laserstream` (Rust)                     | 0.6.3                         |
| `helius-laserstream` (Go)                       | 0.2.0                         |

古い`VersionedTransaction.deserialize` の JavaScript 実装は、レガシーと v0 のみを処理し、先頭の `0x81` バイトでエラーを投げます。古い Yellowstone プロトタイプは v1 メッセージフィールドの前に作られているため、これらのバージョンの gRPC コンシューマは `transactionConfig` を確認しません。Go gRPC クライアントでは、最新の Yellowstone プロトタイプから再生成し、`solana-storage-proto` します。

## transactionConfig からプライオリティ手数料を読み取る

ComputeBudget プログラム指令 (`ComputeBudget111111111111111111111111111111`, `setComputeUnitPrice`, `setComputeUnitLimit`) をスキャンしてトランザクションのプライオリティ手数料を推定するコードは、v1 トランザクションをすべて手数料がゼロであると見なします。v1 では値は `message.transactionConfig` に存在し、単位は異なります:

| 形式       | 手数料の場所                          | 単位               |
| -------- | ------------------------------- | ---------------- |
| レガシー, v0 | `setComputeUnitPrice` 指令        | 計算単位ごとのマイクロラムポーツ |
| v1       | `transactionConfig.priorityFee` | トランザクション全体のラムポーツ |

レガシーの `price × computeUnitLimit ÷ 1e6` 数学を `priorityFee` に移植しないでください。それはすでに合計です。

```typescript priority-fee.ts theme={"system"}
import bs58 from "bs58";

const COMPUTE_BUDGET = "ComputeBudget111111111111111111111111111111";

/** Total priority fee in lamports for a `json`-encoded transaction. */
function priorityFeeLamports(tx: any): number {
  const message = tx.transaction.message;

  // v1: the header carries the total directly.
  if (message.transactionConfig) {
    return message.transactionConfig.priorityFee ?? 0;
  }

  // Legacy and v0: derive it from ComputeBudget instructions.
  let microLamportsPerCu = 0n;
  let computeUnitLimit: bigint | null = null;
  let otherInstructions = 0;

  for (const ix of message.instructions) {
    if (message.accountKeys[ix.programIdIndex] !== COMPUTE_BUDGET) {
      otherInstructions++;
      continue;
    }
    const data = bs58.decode(ix.data);
    const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
    if (data[0] === 2) computeUnitLimit = BigInt(view.getUint32(1, true));
    if (data[0] === 3) microLamportsPerCu = view.getBigUint64(1, true);
  }

  // Without an explicit limit, the runtime grants 200,000 CU per non-ComputeBudget instruction, capped at 1,400,000.
  const limit = computeUnitLimit ?? BigInt(Math.min(otherInstructions * 200_000, 1_400_000));
  return Number((microLamportsPerCu * limit) / 1_000_000n);
}
```

ComputeBudget 指令の有無ではなく、`transactionConfig`（または `version === 1`）に基づいて分岐します。プライオリティ手数料のないレガシートランザクションも指令がないからです。

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

このセクションは、生トランザクションバイトを使用する場合にのみ該当します。例えば、[preconfSubscribe](/docs/ja/pre-confirmations/preconf-subscribe) や [preprocessedSubscribe](/docs/ja/preprocessed-transactions/preprocessed-subscribe)、または `base64` でエンコードされた RPC 応答から受け取る場合です。`json` や `jsonParsed` 応答を使用する場合は、これをスキップします。

トランザクション v1 は、ワイヤレイアウトを2つの方法で変更します。

* **バージョンバイト。** v1 トランザクションは `0x81`（十進数 129）で始まります。v0 トランザクションは `0x80` で始まります。
* **署名が末尾に移動します。** レガシーおよび v0 は最初に署名があり、その後メッセージがあります。トランザクション v1 はメッセージを先にして署名を最後にするため、署名配列を先頭に期待する `bincode` スタイルのデコーダは v1 バイトで失敗します。

<Frame caption="3つのアドレスと1つの指令を持つトランザクション v1 のバイトレイアウト。署名はメッセージの後に末尾にあります。">
  <img src="https://mintcdn.com/helius/VV8h76d8Pisjh8RU/images/solana-transaction-v1-byte-layout.png?fit=max&auto=format&n=VV8h76d8Pisjh8RU&q=85&s=75b76003a7c6a506f6ff24dfc47cb677" alt="Solana トランザクション v1 のバイト単位のレイアウト: バージョンバイト、ヘッダー、構成マスク、寿命指定子、アドレスと指令カウント、3つの32バイトアドレス、計算単位構成、指令ヘッダー、インデックス、識別子、ラムポーツ、および末尾の64バイト署名" width="1280" height="720" data-path="images/solana-transaction-v1-byte-layout.png" />
</Frame>

v1 ワイヤフォーマットのフィールドごとの解説は、[Transaction v1 in the Solana transaction versions article](https://www.helius.dev/blog/solana-transaction-versions#transaction-v1) を参照してください。

v1 レイアウトを理解するデコーダを使用します:

* **Rust:** [`agave-transaction-view`](https://docs.rs/agave-transaction-view) は、レガシー、v0、および v1 の場所で解析します。[`wincode`](https://docs.rs/wincode)、現在のSolana SDKで使用されるバイナリー互換のシリアライザは、`VersionedTransaction`にデコードします。
* **JavaScript / TypeScript:** `@solana/kit` 8.0+ または `@solana/web3.js` v3。

カスタムデコーダでは最初のバイトをチェックする必要があります: `0x81` は v1 を意味し、署名がメッセージの後に続くことを示します。

## チェックリスト

1. `getBlock`、`getTransaction`、`getTransactionsForAddress`、`transactionSubscribe`、`blockSubscribe` を 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](https://www.helius.dev/blog/solana-transaction-versions) をお読みください。

## 関連

<CardGroup cols={2}>
  <Card title="getTransaction guide" icon="magnifying-glass" href="/docs/ja/rpc/guides/gettransaction">
    単一のトランザクションを取得するためのパラメータ、応答形式、例。
  </Card>

  <Card title="getBlock guide" icon="cube" href="/docs/ja/rpc/guides/getblock">
    含まれるすべてのトランザクションを含むフルブロックを取得する。
  </Card>

  <Card title="getTransactionsForAddress" icon="list" href="/docs/ja/rpc/gettransactionsforaddress">
    アドレスごとのフィルタリング済み、ページネーションされたトランザクション履歴を一度の呼び出しで取得する。
  </Card>

  <Card title="Agave 4.2 migration checklist" icon="clipboard-check" href="https://www.helius.dev/blog/agave-4-2-migration-checklist">
    Agave 4.2 のすべての破壊的変更と修正手順。
  </Card>
</CardGroup>
