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

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

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

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

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

* **Проверка баланса SOL:** Определите собственный баланс SOL любого аккаунта.
* **Проверка существования аккаунта:** Проверьте, инициализирован ли аккаунт с указанным публичным ключом, то есть имеются ли у него лампорты или данные.
* **Проверка аккаунтов программ:** Получите данные, сохраненные в аккаунте, принадлежащем программе. Это необходимо для понимания состояния программы.
* **Определение владельца аккаунта:** Узнайте, какая программа владеет аккаунтом. Это помогает определить, как интерпретировать данные аккаунта и принадлежит ли он системной программе.
* **Проверка исполняемости аккаунта:** Определите, содержит ли аккаунт развернутую программу.

## Параметры

1. `publicKey` (строка, обязательный): Публичный ключ запрашиваемого аккаунта в кодировке base58.

2. `config` (объект, необязательный): Объект конфигурации со следующими полями:
   * `commitment` (строка, необязательный): Задает [уровень подтверждения](https://www.helius.dev/blog/solana-commitment-levels), используемый для запроса. Значение по умолчанию — `finalized`.
     * `finalized`: Узел запросит последний блок, который квалифицированное большинство кластера подтвердило как достигший максимального срока блокировки голосов.
     * `confirmed`: Узел запросит последний блок, за который проголосовало квалифицированное большинство кластера.
     * `processed`: Узел запросит свой последний блок. Обратите внимание, что блок может быть неполным.
   * `encoding` (строка, необязательный): Кодировка данных аккаунта. Значение по умолчанию — `base64`.
     * `base58` (медленно)
     * `base64`
     * `base64+zstd` (если данные сжаты)
     * `jsonParsed`: Если данные аккаунта представляют собой известное состояние программы, например аккаунты токенов или стейкинга, узел попытается преобразовать их в структуру JSON. Для обычных аккаунтов программ вместо этого, как правило, возвращаются двоичные данные в кодировке base64.
   * `dataSlice` (объект, необязательный): Ограничивает возвращаемые данные аккаунта определенным срезом. Доступен только для кодировок `base58`, `base64` и `base64+zstd`.
     * `offset` (число): Количество байтов от начала данных аккаунта до начала среза.
     * `length` (число): Количество возвращаемых байтов.
   * `minContextSlot` (число, необязательный): Минимальный слот, в котором можно обработать запрос.

## Ответ

Если аккаунт найден, поле `result` будет содержать объект с двумя основными свойствами:

* `context` (объект): Содержит метаданные запроса.
  * `slot` (число): Слот, в котором была получена информация.
  * `apiVersion` (строка, необязательный): Версия RPC API.

* `value` (объект | null): Если аккаунт не существует, значение будет равно `null`. В противном случае это объект, содержащий:
  * `lamports` (число): Количество лампортов (1 SOL = 1 000 000 000 лампортов), принадлежащих аккаунту.
  * `owner` (строка): Публичный ключ программы-владельца этого аккаунта в кодировке base58.
  * `data` (массив | объект | строка): Данные, сохраненные в аккаунте. Формат зависит от параметра `encoding`, использованного в запросе.
    * Для `base64` (по умолчанию), `base58`, `base64+zstd`: Обычно это массив `[encoded_string, encoding_format]`, например `["string_data", "base64"]`.
    * Для `jsonParsed`: Это может быть объект JSON, если узел RPC способен выполнить синтаксический анализ данных, например для аккаунтов SPL Token. В противном случае, если данные не распознаны как стандартная структура, по умолчанию может использоваться `["", "base64"]` или аналогичный формат.
  * `executable` (логическое значение): `true`, если аккаунт содержит программу; в противном случае — `false`.
  * `rentEpoch` (число): Следующая эпоха, в которой с этого аккаунта будет взиматься арендная плата.
  * `space` (число, необязательный): Длина данных в байтах. (Примечание: в официальной документации Solana указано поле `space`, и некоторые поставщики RPC могут включать его. Оно представляет общий объем пространства, выделенного для данных аккаунта). Подробнее о [данных аккаунтов и десериализации](https://www.helius.dev/blog/solana-dev-101-deserializing-account-data-on-solana) читайте в нашем подробном руководстве.

Если аккаунт не найден, поле `value` в результате будет равно `null`.

## Пример: получение информации об аккаунте

Получим информацию об идентификаторе Serum Program V3 (`9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin`) в основной сети.

**Примечание:** В приведенных ниже примерах замените `YOUR_API_KEY` своим фактическим ключом API Helius.

<CodeGroup>
  ```bash curl theme={"system"}
  curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY -X POST -H "Content-Type: application/json" -d \
  '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getAccountInfo",
    "params": [
      "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin",
      {
        "encoding": "jsonParsed"
      }
    ]
  }'
  ```

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

  async function getAccountDetails() {
    const rpcUrl = 'https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY'; // Replace YOUR_API_KEY
    const connection = new Connection(rpcUrl, 'confirmed');
    const accountPubKey = new PublicKey('9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin');

    try {
      const accountInfo = await connection.getAccountInfo(accountPubKey);

      if (accountInfo === null) {
        console.log('Account not found.');
        return;
      }

      console.log('Account Info:');
      console.log(`   Lamports: ${accountInfo.lamports}`);
      console.log(`   Owner: ${accountInfo.owner.toBase58()}`);
      console.log(`   Executable: ${accountInfo.executable}`);
      console.log(`   Rent Epoch: ${accountInfo.rentEpoch}`);
      // Data is a Buffer, you might need to deserialize it based on the account type
      // console.log(`   Data: ${accountInfo.data.toString()}`); 
    } catch (error) {
      console.error('Error fetching account info:', error);
    }
  }

  getAccountDetails();
  ```

  ```typescript Kit theme={"system"}
  import { address, createSolanaRpc } from "@solana/kit";

  const rpc_url = "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY";
  const rpc = createSolanaRpc(rpc_url);

  const publicKey = address("vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg");
  const accountInfo = await rpc.getAccountInfo(publicKey).send();

  console.log("Account Info:", accountInfo);
  ```

  ```rust Rust theme={"system"}
  use solana_client::nonblocking::rpc_client::RpcClient;
  use solana_sdk::{commitment_config::CommitmentConfig, pubkey::Pubkey};
  use anyhow::Result;
  use std::str::FromStr;

  #[tokio::main]
  async fn main() -> Result<()> {
      let client = RpcClient::new_with_commitment(
          String::from("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY"),
          CommitmentConfig::confirmed()
      );
      let pubkey = Pubkey::from_str("vines1vzrYbzLMRdu58ou5XTby4qAqVRLmqo36NKPTg")?;
      let account = client.get_account(&pubkey).await?;

      println!("{:#?}", account);

      Ok(())
  }
  ```
</CodeGroup>

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

* **Производительность:** Если приложению необходимо часто проверять несколько аккаунтов, используйте `getMultipleAccounts`, чтобы объединять запросы в пакеты и сократить количество обращений к серверу.
* **Десериализация данных:** Поле `data` часто требуется десериализовать с учетом структур данных программы-владельца. Обычно для этого нужны инструменты и библиотеки, предназначенные для конкретной программы, например библиотека SPL Token для аккаунтов токенов. В нашей статье о [десериализации данных аккаунтов](https://www.helius.dev/blog/solana-dev-101-deserializing-account-data-on-solana) приведены полезные методы и примеры.
* **Ограничения частоты запросов:** Учитывайте ограничения частоты запросов узла RPC, особенно при запросе большого количества аккаунтов или частом выполнении запросов.
* **Управление расходами:** `getAccountInfo` обычно является недорогим запросом, но частый опрос может увеличить расходы. Оптимизируйте шаблоны запросов.
* **Используйте `jsonParsed` с осторожностью:** Хотя `jsonParsed` может быть удобен, он поддерживает не все типы аккаунтов, а его выходные данные могут измениться при обновлении структур данных программы. Для критически важных приложений разбор двоичных данных по известной структуре обеспечивает более стабильное поведение.
* **Рассмотрите использование `dataSlice`:** Если вам нужна только небольшая часть данных аккаунта, используйте `dataSlice`, чтобы сократить объем передаваемых данных и потенциально снизить стоимость запросов.

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

<CardGroup cols={2}>
  <Card title="getMultipleAccounts" href="/docs/ru/api-reference/rpc/http/getmultipleaccounts">
    Получите данные нескольких аккаунтов одним пакетным запросом для повышения производительности
  </Card>

  <Card title="getBalance" href="/docs/ru/api-reference/rpc/http/getbalance">
    Получите только баланс SOL без полной информации об аккаунте
  </Card>
</CardGroup>


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