> ## 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 타임스탬프 (초, epoch 이후). 사용할 수 없는 경우 `null`일 수 있음.
* **`meta`** (객체 | null): 트랜잭션 실행에 대한 메타데이터를 포함하는 객체. 트랜잭션이 처리되기 전에 실패했거나 메타데이터를 사용할 수 없는 경우 `null`일 수 있음.
  * **`err`** (객체 | null): 트랜잭션이 실패한 경우 오류 객체, 그렇지 않으면 `null`.
  * **`fee`** (u64): 트랜잭션에 지불된 lamports 수수료.
  * **`preBalances`** (u64 배열): 트랜잭션 처리 전 관련 계정의 lamport 잔액.
  * **`postBalances`** (u64 배열): 트랜잭션 처리 후 관련 계정의 lamport 잔액.
  * **`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`). 트랜잭션이 버전되었고 `maxSupportedTransactionVersion`가 설정되지 않은 경우 `undefined`.

**예제 응답 (`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 트랜잭션 데이터를 가져오고 이해할 수 있게 합니다.
