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

# Как использовать getMultipleAccounts

> Узнайте о сценариях использования getMultipleAccounts, примерах кода, параметрах запроса, структуре ответа и рекомендациях.

Метод RPC [`getMultipleAccounts`](https://www.helius.dev/docs/api-reference/rpc/http/getmultipleaccounts) позволяет эффективно получать информацию сразу о нескольких учетных записях Solana. Вместо отдельных запросов `getAccountInfo` для каждой учетной записи `getMultipleAccounts` позволяет объединить эти запросы в пакет, сократить сетевые издержки и повысить скорость отклика приложения.

## Распространенные сценарии использования

* **Пакетная загрузка данных учетных записей:** Когда приложению необходимо отобразить или обработать данные нескольких известных учетных записей (например, учетных записей токенов пользователя или списка конфигураций ончейн-программ).
* **Трекеры портфелей:** Получение балансов и состояний многочисленных учетных записей токенов, принадлежащих пользователю.
* **Интерфейсы маркетплейсов:** Отображение сведений о нескольких NFT или выставленных на продажу объектах путем одновременного получения данных их учетных записей.
* **Повышение производительности dApp:** Значительное сокращение количества вызовов RPC, что ускоряет загрузку и улучшает взаимодействие с приложением, особенно при работе с большим количеством учетных записей.

## Параметры запроса

1. **`pubkeys`** (`array` из `string`, обязательный):
   * Массив строк публичных ключей учетных записей, которые требуется запросить, в кодировке base58.
   * Не более 100 публичных ключей в одном запросе.
   * Пример: `["So11111111111111111111111111111111111111112", "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"]`

2. **`options`** (`object`, необязательный): Объект конфигурации, содержащий одно или несколько следующих полей:
   * **`commitment`** (`string`): Задает [уровень подтверждения](https://www.helius.dev/blog/solana-commitment-levels) для запроса (например, `"finalized"`, `"confirmed"`, `"processed"`).
   * **`encoding`** (`string`): Кодировка данных учетной записи. Доступные варианты:
     * `"base64"` (по умолчанию): стандартная кодировка base64.
     * `"base58"`: работает медленнее, но может быть полезна в некоторых случаях.
     * `"base64+zstd"`: сжатые с помощью zstd данные в кодировке base64.
     * `"jsonParsed"`: если учетная запись принадлежит программе, для которой у узла RPC есть синтаксический анализатор (например, SPL Token Program или Stake Program), поле `data` будет содержать объект JSON. Это очень удобно для работы со структурированными данными.
   * **`dataSlice`** (`object`): Позволяет получить только определенную часть данных учетной записи. Это полезно для больших учетных записей, когда требуется лишь небольшой фрагмент информации.
     * `offset` (`usize`): Смещение в байтах от начала данных учетной записи.
     * `length` (`usize`): Количество байтов, возвращаемых начиная с указанного смещения.
     * *Примечание: `dataSlice` доступен только для кодировок `base58`, `base64` или `base64+zstd`.*
   * **`minContextSlot`** (`u64`): Минимальный слот, на котором может быть обработан запрос.

## Структура ответа

Объект ответа JSON-RPC содержит поле `result` со следующими данными:

* **`context`** (`object`):
  * `slot` (`u64`): Слот, на котором была получена информация.
  * `apiVersion` (`string`, необязательный): Версия API узла.
* **`value`** (`array`):
  * Массив, каждый элемент которого соответствует публичному ключу с тем же индексом в массиве `pubkeys` запроса.
  * Каждый элемент будет содержать одно из следующего:
    * `null`: Если учетная запись с указанным публичным ключом не существует или при ее получении произошла ошибка.
    * **Объект учетной записи** со следующими полями:
      * `lamports` (`u64`): Количество лампортов, принадлежащих учетной записи.
      * `owner` (`string`): Публичный ключ программы, которой принадлежит учетная запись, в кодировке base58.
      * `data` (`array` или `object`): Данные учетной записи. Если для `encoding` задано значение `jsonParsed` и существует синтаксический анализатор, поле будет содержать объект JSON. В противном случае оно обычно содержит массив `["encoded_string", "encoding_format"]` (например, `["SGVsbG8=", "base64"]`).
      * `executable` (`boolean`): Указывает, содержит ли учетная запись программу, то есть является ли она исполняемой.
      * `rentEpoch` (`u64`): Следующая эпоха, в которой с этой учетной записи будет взиматься арендная плата.
      * `space` (`u64`): Размер данных учетной записи в байтах.

## Примеры

### 1. Получение основной информации о двух учетных записях

В этом примере получаются данные двух учетных записей: SOL Llama (NFT) и 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. Получение разобранных данных учетных записей токенов

В этом примере получаются данные двух учетных записей SPL Token и запрашивается кодировка `jsonParsed` для получения структурированных данных.

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

## Рекомендации для разработчиков

* **Не более 100 учетных записей:** За один вызов можно запросить не более 100 учетных записей.
* **Атомарность:** Запрос не является атомарным: если получение одной учетной записи завершится ошибкой, другие все равно могут быть получены успешно. Проверяйте каждый элемент массива `value` на значение `null`.
* **Удобство `jsonParsed`:** При работе с распространенными типами учетных записей, такими как учетные записи SPL Token, настоятельно рекомендуется использовать кодировку `jsonParsed`. Это избавляет от необходимости вручную десериализовать данные.
* **`dataSlice` для больших учетных записей:** Для очень больших учетных записей (например, некоторых учетных записей состояния программ) используйте `dataSlice`, чтобы получить только необходимые байты и избежать передачи избыточного объема данных.
* **Обработка ошибок:** Будьте готовы обрабатывать элементы `null` в массиве `value` ответа. Они указывают, что учетная запись не найдена или ее не удалось получить.

Используя `getMultipleAccounts`, вы можете создавать более производительные и масштабируемые приложения Solana.

## Связанные методы

<CardGroup cols={2}>
  <Card title="getAccountInfo" href="/docs/ru/api-reference/rpc/http/getaccountinfo">
    Получение подробной информации об одной учетной записи
  </Card>

  <Card title="getProgramAccounts" href="/docs/ru/api-reference/rpc/http/getprogramaccounts">
    Получение всех учетных записей, принадлежащих определенной программе
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.