> ## 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.

# getTransactionの使用方法

> getTransactionの使用例、コード例、リクエストパラメータ、応答構造、ヒントを学びます。

[`getTransaction`](https://www.helius.dev/docs/api-reference/rpc/http/gettransaction) RPCメソッドは、署名を提供することによって、確認されたトランザクションに関する詳細情報を取得することができます。これには、トランザクションのスロット、ブロック時間、メタデータ（手数料、ステータス、残高の変化など）、およびトランザクション自体の構造が含まれます。

<Warning>
  **パフォーマンス向上のためバッチ処理を避ける**

  アーカイブメソッドのバッチ処理は遅延を大幅に増加させます。100リクエストを超えるバッチは許可されていません。
</Warning>

## 一般的な使用例

* **トランザクションの確認:** トランザクションが処理されたことを確認し、その結果（成功または失敗）を確認。
* **取引履歴の表示:** ウォレットやエクスプローラでユーザーの過去の取引の詳細を表示。
* **監査と分析:** 実行された指示、支払われた手数料、関与したアカウントなど、取引の詳細を調べる。
* **失敗した取引のデバッグ:** メタデータの`logMessages`、`err`フィールドを調査して、取引が失敗した理由を理解する。
* **データのインデックス化:** トランザクションから特定の情報を抽出し、オフチェーンのストレージと分析に使用。

## リクエストパラメータ

1. **`transactionSignature`** (文字列、必須): クエリしたいbase-58エンコードされたトランザクション署名。

2. **`options`** (オブジェクト、オプション): オプションの設定オブジェクトで、以下を含むことができます:
   * **`commitment`** (文字列、オプション): [コミットメントレベル](https://www.helius.dev/blog/solana-commitment-levels)を指定します（例: `"finalized"`, `"confirmed"`）。指定されない場合、ノードのデフォルトのコミットメントが使用されます（通常は`"finalized"`）。
   * **`encoding`** (文字列、オプション): `transaction`データのエンコーディング。一般的な値:
     * `"json"`: トランザクションデータを構造化されたJSON形式で返します（ただし、インストラクションはbase64エンコードされている場合があります）。
     * `"jsonParsed"`: プログラム固有のインストラクションを可能な限り人間が読めるJSON構造に解析してトランザクションデータを返します。解析にはこれが最も有用です。
     * `"base58"`: トランザクションデータをbase-58エンコードされた文字列で返します。
     * `"base64"`: トランザクションデータをbase-64エンコードされた文字列で返します。
     * 指定がない場合、Heliusは `"json"` をデフォルトとしますが、Solanaのデフォルトは異なる場合があります。これを指定することをお勧めします。
   * **`maxSupportedTransactionVersion`** (数字、オプション): RPCエンドポイントが処理する最大トランザクションバージョン。
     * `0` に設定して、バージョン付きトランザクション（従来を含む）を含めます。
     * 省略された場合、一部のノードは従来のトランザクションのみを返すか、バージョン付きトランザクションに遭遇した場合エラーになる可能性があります。これを`0`に設定してすべてのトランザクションタイプをサポートすることを強く推奨します。

## 応答構造

トランザクションが見つからない場合（例: まだ処理されていない、または署名が間違っている）か、指定されたコミットメントレベルで確認されていない場合、`null`を返します。それ以外の場合、次のフィールドを含むオブジェクトを返します:

* **`slot`** (u64): トランザクションがブロックに含まれたスロット番号。
* **`blockTime`** (i64 | null): トランザクションを含むブロックが生成された推定Unixタイムスタンプ（エポックからの秒数）。利用できない場合は`null`。
* **`meta`** (オブジェクト | null): トランザクションの実行に関するメタデータを含むオブジェクト。トランザクションが処理される前に失敗した場合やメタデータが利用できない場合は`null`。
  * **`err`** (オブジェクト | null): トランザクションが失敗した場合はエラーオブジェクト、それ以外は`null`。
  * **`fee`** (u64): トランザクションのために支払ったラムポート手数料。
  * **`preBalances`** (u64の配列): トランザクションが処理される前のアカウントのラムポート残高。
  * **`postBalances`** (u64の配列): トランザクションが処理された後のアカウントのラムポート残高。
  * **`preTokenBalances`** (オブジェクトの配列 | null): トランザクション前のトークンアカウントのトークン残高。
  * **`postTokenBalances`** (オブジェクトの配列 | null): トランザクション後のトークンアカウントのトークン残高。
  * **`innerInstructions`** (オブジェクトの配列 | null): このトランザクション内でCPI（クロスプログラム呼び出し）の一部として実行された命令の配列。
  * **`logMessages`** (文字列の配列 | null): トランザクションの命令や内部命令によって発行されたログメッセージの配列。
  * **`loadedAddresses`** (オブジェクト, オプション): このトランザクションのためにアドレスルックアップテーブルからロードされたアカウントを指定します。`writable`と`readonly`の公開鍵の配列を含みます。
  * **`returnData`** (オブジェクト, オプション): `sol_set_return_data`と`sol_get_return_data`経由でトランザクションによって返されるデータ。 `programId`（文字列）と`data`（配列: `[string, encoding]`）を含みます。
  * **`computeUnitsConsumed`** (u64, オプション): このトランザクションが消費した計算ユニットの数。
* **`transaction`** (オブジェクト | 配列): トランザクション構造自体。フォーマットは`encoding`パラメータに依存します:
  * `encoding`が`"jsonParsed"`または`"json"`の場合: `message`（`accountKeys`、`instructions`、`recentBlockhash`、などを含む）と`signatures`（文字列の配列）を含むオブジェクト。
  * `encoding`が`"base58"`、`"base64"`の場合: 配列`[encoded_string, encoding_format_string]`。
* **`version`** ("legacy" | 数字 | undefined): トランザクションのバージョン。古いトランザクションの場合は`"legacy"`、バージョン付きトランザクションの場合は数字（例: `0`）。`undefined`は`maxSupportedTransactionVersion`が設定されていない場合にバージョン付きトランザクションです。

**例応答(`jsonParsed`エンコーディング):**

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": {
    "blockTime": 1635900000,
    "meta": {
      "err": null,
      "fee": 5000,
      "innerInstructions": [],
      "logMessages": [
        "Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS invoke [1]",
        "Program log: Memo 'Hello, Solana!'",
        "Program Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS success"
      ],
      "postBalances": [
        499999999999994999, 
        1000000000
      ],
      "postTokenBalances": [],
      "preBalances": [
        500000000000000000, 
        1000000000
      ],
      "preTokenBalances": [],
      "rewards": [],
      "status": { "Ok": null },
      "computeUnitsConsumed": 200
    },
    "slot": 98765432,
    "transaction": {
      "message": {
        "accountKeys": [
          "SysvarRent111111111111111111111111111111111",
          "Vote111111111111111111111111111111111111111"
        ],
        "instructions": [
          {
            "parsed": {
              "type": "vote",
              "info": {
                "votePubkey": "Vote111111111111111111111111111111111111111",
                "slot": 123,
                "hash": "abc..."
              }
            },
            "program": "vote",
            "programId": "Vote111111111111111111111111111111111111111"
          }
        ],
        "recentBlockhash": "xyz..."
      },
      "signatures": [
        "sig1..."
      ]
    },
    "version": "legacy"
  },
  "id": 1
}
```

## コード例

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <TRANSACTION_SIGNATURE> with an actual signature
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getTransaction",
      "params": [
        "<TRANSACTION_SIGNATURE>",
        {
          "encoding": "jsonParsed",
          "maxSupportedTransactionVersion": 0
        }
      ]
    }' \
    <YOUR_RPC_URL>
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  const { Connection } = require('@solana/web3.js');

  async function getTransactionDetails(signature) {
    // Replace with your RPC endpoint
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');

    try {
      const transaction = await connection.getTransaction(signature, {
        maxSupportedTransactionVersion: 0, // Recommended to support all transaction versions
        // commitment: 'confirmed', // Optional: specify commitment level
      });

      if (transaction) {
        console.log('Transaction Details:');
        console.log(`  Slot: ${transaction.slot}`);
        console.log(`  Block Time: ${transaction.blockTime ? new Date(transaction.blockTime * 1000).toLocaleString() : 'N/A'}`);
        console.log(`  Fee: ${transaction.meta ? transaction.meta.fee : 'N/A'} lamports`);
        console.log(`  Status: ${transaction.meta && transaction.meta.err ? 'Failed' : 'Success'}`);
        if (transaction.meta && transaction.meta.err) {
          console.log(`    Error: ${JSON.stringify(transaction.meta.err)}`);
        }
        // console.log(JSON.stringify(transaction, null, 2)); // Log full transaction details

        if (transaction.meta && transaction.meta.logMessages) {
          console.log('  Log Messages:');
          transaction.meta.logMessages.forEach(log => console.log(`    ${log}`));
        }

      } else {
        console.log('Transaction not found or not confirmed.');
      }
    } catch (error) {
      console.error(`Error fetching transaction ${signature}:`, error);
    }
  }

  // Replace with an actual transaction signature from Mainnet-beta or your test environment
  const exampleSignature = '5h4zCwobYsdL3mY26FgfXy8c4rTPkX6gYVXW8w2tTjCXZMWzE9jX9p8Q2Y8Yj9p8ZQ8Yj9p8ZQ8Yj9p8ZQ8Yj9'; // Replace with a real signature
  // getTransactionDetails(exampleSignature);

  // Example of a known transaction (you'll need to find a recent one on an explorer)
  // getTransactionDetails('2xNdnHjZDmJRy1L6jC1mF87K3V9nXZo2bY6vA8GzQ3T7bS9xU8cM7sR5eD3fG2hJ1aB0cE9lK6mN5pP4qR7');

  console.log("Please replace 'exampleSignature' with a real transaction signature to run the example.");

  ```
</CodeGroup>

## 開発者のヒント

* **トランザクションの最終性:** 適切な`commitment`レベルでクエリを行うことを確認してください。指定されたコミットメントに到達していないトランザクションをリクエストすると`null`が返されます。
* **データボリューム:** 応答オブジェクトは、特に多数の指示や詳細なログを含む複雑なトランザクションの場合、非常に大きくなる可能性があります。データを処理する際には注意してください。
* **`jsonParsed`対`json`:** `jsonParsed`は非常に便利ですが、特定のプログラムに対するRPCノードの解析サポートに依存します。プログラムが認識されていない場合、その指示は`jsonParsed`でも解析されない形式にフォールバックする可能性があります。
* **バージョン付きトランザクション:** リクエストオプションで常に`maxSupportedTransactionVersion: 0`を設定して、アプリケーションが従来およびバージョン付きの両方のトランザクションを処理できるようにしてください。そうしないと、新しいトランザクション形式のデータが見逃されたり、エラーが発生したりする可能性があります。
* **RPCプロバイダーの違い:** コアAPIは標準ですが、一部のRPCプロバイダーは拡張された解析や追加のフィールドを提供する場合があります。たとえば、Heliusは豊富なトランザクション解析を提供します。

このガイドは、`getTransaction` RPCメソッドの包括的な概要を提供し、詳細なSolanaトランザクションデータを取得して理解することを可能にします。
