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

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

Metode RPC [`getMultipleAccounts`](https://www.helius.dev/docs/api-reference/rpc/http/getmultipleaccounts) adalah cara yang sangat efisien untuk mengambil informasi beberapa akun Solana secara bersamaan. Alih-alih membuat permintaan `getAccountInfo` terpisah untuk setiap akun, `getMultipleAccounts` memungkinkan Anda mengelompokkan permintaan tersebut, sehingga mengurangi overhead jaringan dan meningkatkan kecepatan respons aplikasi Anda.

## Kasus Penggunaan Umum

* **Memuat Data Akun secara Massal:** Saat aplikasi Anda perlu menampilkan atau memproses data dari beberapa akun yang diketahui (misalnya, akun token pengguna atau daftar konfigurasi program on-chain).
* **Pelacak Portofolio:** Mengambil saldo dan status berbagai akun token milik pengguna.
* **Antarmuka Marketplace:** Menampilkan detail beberapa NFT atau item yang terdaftar dengan mengambil data akunnya sekaligus.
* **Meningkatkan Performa dApp:** Mengurangi jumlah panggilan RPC secara signifikan, sehingga waktu pemuatan lebih cepat dan pengalaman pengguna lebih baik, terutama saat menangani banyak akun.

## Parameter Permintaan

1. **`pubkeys`** (`array` dari `string`, wajib):
   * Larik string kunci publik yang dikodekan dengan base-58 untuk akun yang ingin Anda kueri.
   * Maksimal 100 kunci publik per permintaan.
   * Contoh: `["So11111111111111111111111111111111111111112", "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"]`

2. **`options`** (`object`, opsional): Objek konfigurasi yang memuat satu atau beberapa bidang berikut:
   * **`commitment`** (`string`): Menentukan [tingkat komitmen](https://www.helius.dev/blog/solana-commitment-levels) untuk kueri (misalnya, `"finalized"`, `"confirmed"`, `"processed"`).
   * **`encoding`** (`string`): Pengodean untuk data akun. Opsi yang tersedia meliputi:
     * `"base64"` (default): Pengodean base64 standar.
     * `"base58"`: Lebih lambat, tetapi mungkin berguna dalam konteks tertentu.
     * `"base64+zstd"`: Data terkompresi zstd yang dikodekan dengan base64.
     * `"jsonParsed"`: Jika akun dimiliki oleh program yang parser-nya tersedia di node RPC (misalnya, SPL Token Program atau Stake Program), bidang `data` akan berupa objek JSON. Opsi ini sangat berguna untuk data terstruktur.
   * **`dataSlice`** (`object`): Memungkinkan Anda hanya mengambil bagian tertentu dari data akun. Opsi ini berguna untuk akun berukuran besar ketika Anda hanya memerlukan sebagian kecil informasi.
     * `offset` (`usize`): Offset dalam byte dari awal data akun.
     * `length` (`usize`): Jumlah byte yang akan dikembalikan mulai dari offset.
     * *Catatan: `dataSlice` hanya tersedia untuk pengodean `base58`, `base64`, atau `base64+zstd`.*
   * **`minContextSlot`** (`u64`): Slot minimum tempat permintaan dapat dievaluasi.

## Struktur Respons

Objek respons JSON-RPC akan memiliki bidang `result` yang memuat:

* **`context`** (`object`):
  * `slot` (`u64`): Slot tempat informasi diambil.
  * `apiVersion` (`string`, opsional): Versi API node.
* **`value`** (`array`):
  * Larik dengan setiap elemen yang sesuai dengan kunci publik pada indeks yang sama dalam larik `pubkeys` milik permintaan.
  * Setiap elemen akan berupa salah satu dari berikut:
    * `null`: Jika akun dengan kunci publik yang ditentukan tidak ada atau terjadi kesalahan pada akun tersebut.
    * **Objek Akun** dengan bidang berikut:
      * `lamports` (`u64`): Jumlah lamport yang dimiliki akun.
      * `owner` (`string`): Kunci publik yang dikodekan dengan base-58 dari program yang memiliki akun tersebut.
      * `data` (`array` atau `object`): Data akun. Jika `encoding` adalah `jsonParsed` dan tersedia parser, bidang ini akan berupa objek JSON. Jika tidak, bidang ini biasanya berupa larik `["encoded_string", "encoding_format"]` (misalnya, `["SGVsbG8=", "base64"]`).
      * `executable` (`boolean`): Menunjukkan apakah akun berisi program (dapat dieksekusi).
      * `rentEpoch` (`u64`): Epoch berikutnya ketika akun ini harus membayar biaya sewa.
      * `space` (`u64`): Panjang data akun dalam byte.

## Contoh

### 1. Mengambil Informasi Dasar untuk Dua Akun

Contoh ini mengambil data untuk dua akun: SOL Llama (sebuah NFT) dan Serum Dex Program v3.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  # SOL Llama Mint: Abug4qgG1x23AEdjS2h9CEJ1m6ha2Z22LdK2kL2pys3F
  # Serum Dex Program v3: 9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getMultipleAccounts",
      "params": [
        [
          "Abug4qgG1x23AEdjS2h9CEJ1m6ha2Z22LdK2kL2pys3F",
          "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin"
        ]
      ]
    }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  // Replace <api-key> with your Helius API key
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function fetchMultipleAccountInfo() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const accountPubkeys = [
      new PublicKey('Abug4qgG1x23AEdjS2h9CEJ1m6ha2Z22LdK2kL2pys3F'), // SOL Llama
      new PublicKey('9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin')  // Serum Dex Program v3
    ];

    try {
      const accountsInfo = await connection.getMultipleAccountsInfo(accountPubkeys);
      
      accountsInfo.forEach((account, index) => {
        console.log(`--- Account ${index + 1} (${accountPubkeys[index].toBase58()}) ---`);
        if (account) {
          console.log(`  Owner: ${account.owner.toBase58()}`);
          console.log(`  Lamports: ${account.lamports}`);
          console.log(`  Executable: ${account.executable}`);
          console.log(`  Data length: ${account.data.length}`);
          // For brevity, not logging full data buffer
        } else {
          console.log("  Account not found or error fetching.");
        }
      });
    } catch (error) {
      console.error('Error fetching multiple accounts:', error);
    }
  }

  fetchMultipleAccountInfo();
  ```
</CodeGroup>

### 2. Mengambil Data Akun Token yang Telah Diuraikan

Contoh ini mengambil data untuk dua akun SPL Token dan meminta pengodean `jsonParsed` untuk memperoleh data terstruktur.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  # Example USDC Token Account 1: GqoZ2MCrdTtygoX1F2b8X7F2tDXxNxyvMvykR9RzQW8p
  # Example USDT Token Account 2: HYnLMbkaPMh9W2aPNy2yP4LzLSWWw9zSCYEZdX2g2E7m
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getMultipleAccounts",
      "params": [
        [
          "GqoZ2MCrdTtygoX1F2b8X7F2tDXxNxyvMvykR9RzQW8p",
          "HYnLMbkaPMh9W2aPNy2yP4LzLSWWw9zSCYEZdX2g2E7m"
        ],
        {
          "encoding": "jsonParsed"
        }
      ]
    }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  // Replace <api-key> with your Helius API key
  const { Connection, PublicKey } = require('@solana/web3.js');

  async function fetchParsedTokenAccounts() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const tokenAccountPubkeys = [
      new PublicKey('GqoZ2MCrdTtygoX1F2b8X7F2tDXxNxyvMvykR9RzQW8p'), // Example USDC account
      new PublicKey('HYnLMbkaPMh9W2aPNy2yP4LzLSWWw9zSCYEZdX2g2E7m')  // Example USDT account
    ];

    try {
      const accountsInfo = await connection.getMultipleAccountsInfo(tokenAccountPubkeys, 'confirmed'); // Can also pass commitment here
      // Note: @solana/web3.js's getMultipleAccountsInfo automatically requests jsonParsed if the node supports it for token accounts.
      // For explicit control with raw RPC, you use the options object as in the cURL example.

      accountsInfo.forEach((account, index) => {
        console.log(`--- Token Account ${index + 1} (${tokenAccountPubkeys[index].toBase58()}) ---`);
        if (account && account.data && typeof account.data !== 'string') { // Check if data is parsed
          // The actual structure of account.data depends on the program (e.g., SPL Token)
          // For SPL Token accounts, you'd typically find parsed data in account.data.parsed.info
          const parsedInfo = (account.data as any).parsed?.info;
          if (parsedInfo) {
              console.log(`  Mint: ${parsedInfo.mint}`);
              console.log(`  Owner: ${parsedInfo.owner}`);
              console.log(`  Amount: ${parsedInfo.tokenAmount.uiAmountString} (decimals: ${parsedInfo.tokenAmount.decimals})`);
          } else {
              console.log("  Account data is not in the expected parsed format or is not a token account.");
              // console.log("Raw data:", account.data.toString('base64')); // if buffer
          }
        } else if (account) {
          console.log("  Account found, but data is not parsed or is a string (binary data).");
          // console.log("  Raw data:", account.data.toString()); // if string
        } else {
          console.log("  Account not found or error fetching.");
        }
      });
    } catch (error) {
      console.error('Error fetching parsed token accounts:', error);
    }
  }

  fetchParsedTokenAccounts();
  ```
</CodeGroup>

## Tips untuk Developer

* **Maksimal 100 Akun:** Anda dapat meminta maksimal 100 akun per panggilan.
* **Atomisitas:** Permintaan ini tidak bersifat atomik, dalam artian jika pencarian satu akun gagal, pencarian lainnya mungkin tetap berhasil. Periksa setiap elemen dalam larik `value` untuk menemukan `null`.
* **Kemudahan `jsonParsed`:** Penggunaan pengodean `jsonParsed` sangat disarankan saat menangani jenis akun umum seperti akun SPL Token karena Anda tidak perlu melakukan deserialisasi secara manual.
* **`dataSlice` untuk Akun Besar:** Untuk akun yang sangat besar (misalnya, beberapa akun status program), gunakan `dataSlice` agar hanya mengambil byte yang diperlukan dan menghindari transfer data berlebihan.
* **Penanganan Kesalahan:** Bersiaplah menangani entri `null` dalam larik `value` pada respons, yang menunjukkan bahwa akun tidak ditemukan atau tidak dapat diambil.

Dengan memanfaatkan `getMultipleAccounts`, Anda dapat membangun aplikasi Solana yang memiliki performa lebih tinggi dan lebih mudah diskalakan.

## Metode Terkait

<CardGroup cols={2}>
  <Card title="getAccountInfo" href="/docs/id/api-reference/rpc/http/getaccountinfo">
    Ambil informasi terperinci untuk satu akun
  </Card>

  <Card title="getProgramAccounts" href="/docs/id/api-reference/rpc/http/getprogramaccounts">
    Dapatkan semua akun yang dimiliki oleh program tertentu
  </Card>
</CardGroup>
