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

# Cara Menggunakan getTransaction

> Pelajari kasus penggunaan getTransaction, contoh kode, parameter permintaan, struktur respons, dan tips.

Metode RPC [`getTransaction`](https://www.helius.dev/docs/api-reference/rpc/http/gettransaction) memungkinkan Anda mengambil informasi mendetail tentang transaksi yang telah dikonfirmasi dengan memberikan tanda tangannya. Informasi ini mencakup slot transaksi, waktu blok, metadata (seperti biaya, status, dan perubahan saldo), serta struktur transaksi itu sendiri.

<Warning>
  **Hindari Pengelompokan untuk Performa yang Lebih Baik**

  Mengelompokkan metode arsip akan meningkatkan latensi secara signifikan. Pengelompokan yang berisi lebih dari 100 permintaan tidak diizinkan.
</Warning>

## Kasus Penggunaan Umum

* **Verifikasi Transaksi:** Mengonfirmasi bahwa transaksi telah diproses dan memeriksa hasilnya (berhasil atau gagal).
* **Tampilan Riwayat Transaksi:** Menampilkan detail transaksi sebelumnya kepada pengguna di dompet atau penjelajah.
* **Audit dan Analisis:** Memeriksa detail transaksi, termasuk instruksi yang dijalankan, biaya yang dibayarkan, dan akun yang terlibat.
* **Men-debug Transaksi yang Gagal:** Memeriksa bidang `logMessages` dan `err` dalam metadata untuk memahami penyebab kegagalan transaksi.
* **Pengindeksan Data:** Mengekstrak informasi tertentu dari transaksi untuk penyimpanan dan analisis off-chain.

## Parameter Permintaan

1. **`transactionSignature`** (string, wajib): Tanda tangan transaksi berkode base-58 yang ingin Anda kueri.

2. **`options`** (objek, opsional): Objek konfigurasi opsional yang dapat mencakup:
   * **`commitment`** (string, opsional): Menentukan [tingkat komitmen](https://www.helius.dev/blog/solana-commitment-levels) (misalnya, `"finalized"`, `"confirmed"`). Jika tidak diberikan, komitmen default node akan digunakan (biasanya `"finalized"`).
   * **`encoding`** (string, opsional): Pengodean untuk data `transaction`. Nilai yang umum:
     * `"json"`: Mengembalikan data transaksi dalam format JSON terstruktur (tetapi instruksi mungkin masih dikodekan dalam base64).
     * `"jsonParsed"`: Mengembalikan data transaksi dengan instruksi khusus program yang diuraikan menjadi struktur JSON yang dapat dibaca manusia jika memungkinkan. Pengodean ini sering kali paling berguna untuk analisis.
     * `"base58"`: Mengembalikan data transaksi sebagai string berkode base-58.
     * `"base64"`: Mengembalikan data transaksi sebagai string berkode base-64.
     * Nilai default-nya adalah `"json"` jika tidak ditentukan oleh Helius, tetapi nilai default Solana mungkin berbeda. Sebaiknya tentukan nilai ini.
   * **`maxSupportedTransactionVersion`** (angka, opsional): Versi transaksi maksimum yang harus diproses oleh endpoint RPC.
     * Atur ke `1` untuk menyertakan transaksi lama, v0, dan v1.
     * Jika dihilangkan atau diatur lebih rendah daripada versi transaksi, permintaan akan gagal dengan kesalahan JSON-RPC `-32015` (`Transaction version (1) is not supported by the requesting client`). Selalu atur nilai ini ke `1`. Lihat [Dukungan transaksi v1](/docs/id/rpc/transaction-v1).

## Struktur Respons

Metode ini mengembalikan `null` jika transaksi tidak ditemukan (misalnya, belum diproses atau tanda tangannya salah) atau belum dikonfirmasi pada tingkat komitmen yang ditentukan. Jika tidak, metode ini mengembalikan objek dengan bidang berikut:

* **`slot`** (u64): Nomor slot tempat transaksi disertakan dalam sebuah blok.
* **`blockTime`** (i64 | null): Perkiraan stempel waktu Unix (detik sejak epoch) saat blok yang berisi transaksi dibuat. Dapat berupa `null` jika tidak tersedia.
* **`meta`** (objek | null): Objek yang berisi metadata tentang eksekusi transaksi. Dapat berupa `null` jika transaksi gagal sebelum diproses atau jika metadata tidak tersedia.
  * **`err`** (objek | null): Objek kesalahan jika transaksi gagal; jika tidak, nilainya `null`.
  * **`fee`** (u64): Biaya dalam lamport yang dibayarkan untuk transaksi.
  * **`preBalances`** (array u64): Saldo lamport akun yang terlibat *sebelum* transaksi diproses.
  * **`postBalances`** (array u64): Saldo lamport akun yang terlibat *setelah* transaksi diproses.
  * **`preTokenBalances`** (array objek | null): Saldo token dari akun token yang terlibat *sebelum* transaksi.
  * **`postTokenBalances`** (array objek | null): Saldo token dari akun token yang terlibat *setelah* transaksi.
  * **`innerInstructions`** (array objek | null): Array instruksi yang dijalankan sebagai bagian dari CPI (Pemanggilan Lintas Program) dalam transaksi ini.
  * **`logMessages`** (array string | null): Array pesan log yang dikeluarkan oleh instruksi transaksi dan instruksi internal apa pun.
  * **`loadedAddresses`** (objek, opsional): Menentukan akun yang dimuat dari tabel pencarian alamat untuk transaksi ini. Berisi array kunci publik `writable` dan `readonly`.
  * **`returnData`** (objek, opsional): Data yang dikembalikan oleh transaksi melalui `sol_set_return_data` dan `sol_get_return_data`. Berisi `programId` (string) dan `data` (array: `[string, encoding]`).
  * **`computeUnitsConsumed`** (u64, opsional): Jumlah unit komputasi yang digunakan oleh transaksi ini.
* **`transaction`** (objek | array): Struktur transaksi itu sendiri. Formatnya bergantung pada parameter `encoding`:
  * Jika `encoding` adalah `"jsonParsed"` atau `"json"`: Objek dengan `message` (berisi `accountKeys`, `instructions`, `recentBlockhash`, dan sebagainya) dan `signatures` (array string).
  * Jika `encoding` adalah `"base58"`, `"base64"`: Array `[encoded_string, encoding_format_string]`.
* **`version`** ("legacy" | angka | undefined): Versi transaksi. Dapat berupa `"legacy"` untuk transaksi lama atau angka (`0` atau `1`) untuk transaksi berversi. `undefined` jika `maxSupportedTransactionVersion` tidak diatur dan transaksi memiliki versi. Transaksi v1 juga membawa objek `transactionConfig` dalam `message` dengan anggaran komputasi (`computeUnitLimit`, `heapSize`, `loadedAccountsDataSizeLimit`, `priorityFee`), yang menggantikan instruksi program ComputeBudget. `priorityFee` miliknya adalah total biaya dalam lamport, bukan mikro-lamport per unit komputasi.

**Contoh Respons (pengodean `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
}
```

## Contoh Kode

<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": 1
        }
      ]
    }' \
    <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: 1, // Required for legacy, v0, and v1 transactions
        // 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>

## Tips untuk Developer

* **Finalitas Transaksi:** Pastikan Anda melakukan kueri dengan tingkat `commitment` yang sesuai. Meminta transaksi yang belum mencapai komitmen yang ditentukan akan menghasilkan `null`.
* **Volume Data:** Objek respons dapat berukuran sangat besar, terutama untuk transaksi kompleks dengan banyak instruksi atau pencatatan log yang mendetail. Perhatikan hal ini saat memproses data.
* **`jsonParsed` vs. `json`:** Meskipun `jsonParsed` sangat praktis, dukungan penguraian bergantung pada kemampuan node RPC untuk program tertentu. Jika sebuah program tidak dikenali, instruksinya mungkin kembali menggunakan format yang kurang terurai meskipun menggunakan `jsonParsed`.
* **Transaksi Berversi:** Selalu atur `maxSupportedTransactionVersion: 1` dalam opsi permintaan Anda untuk memastikan aplikasi dapat menangani transaksi lama maupun berversi. Jika tidak, Anda mungkin kehilangan data atau mengalami kesalahan untuk format transaksi yang lebih baru.
* **Perbedaan Penyedia RPC:** Meskipun API intinya bersifat standar, beberapa penyedia RPC mungkin menawarkan penguraian yang lebih canggih atau bidang tambahan. Helius, misalnya, menyediakan penguraian transaksi yang lengkap.

Panduan ini memberikan gambaran menyeluruh tentang metode RPC `getTransaction`, sehingga Anda dapat mengambil dan memahami data transaksi Solana secara mendetail.
