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

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

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

Метод RPC [`getVoteAccounts`](https://www.helius.dev/docs/api-reference/rpc/http/getvoteaccounts) возвращает информацию обо всех аккаунтах голосования (валидаторах) в текущем банке. Он разделяет валидаторов на `current` (активных) и `delinquent`, а также предоставляет сведения об их стейке, активности голосования и идентификаторе.

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

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

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

Этот метод принимает необязательный объект конфигурации со следующими полями:

1. **`commitment`** (строка, необязательно): Задает [уровень подтверждения](https://www.helius.dev/blog/solana-commitment-levels) для запроса (например, `"finalized"`, `"confirmed"`, `"processed"`). Если параметр не указан, используется уровень подтверждения узла по умолчанию.
2. **`votePubkey`** (строка, необязательно): Если параметр указан, результаты будут отфильтрованы и будут содержать только заданный адрес аккаунта голосования валидатора (в кодировке base-58).
3. **`keepUnstakedDelinquents`** (логическое значение, необязательно): По умолчанию имеет значение `false`. Если установить значение `true`, список `delinquent` будет включать валидаторов без активированного стейка. В противном случае они будут исключены.
4. **`delinquentSlotDistance`** (u64, необязательно): Задает количество слотов, на которое валидатор должен отставать от вершины реестра, чтобы считаться неактивным. Если параметр не указан, узел использует значение по умолчанию.

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

Поле `result` в ответе JSON-RPC представляет собой объект, содержащий два массива:

* **`current`**: Массив объектов, каждый из которых представляет активный аккаунт голосования со следующими полями:
  * **`votePubkey`** (строка): Адрес аккаунта голосования (в кодировке base-58).
  * **`nodePubkey`** (строка): Открытый ключ идентификатора узла валидатора (в кодировке base-58).
  * **`activatedStake`** (u64): Объем стейка в лампортах, делегированный этому аккаунту голосования и активный в текущей эпохе.
  * **`epochVoteAccount`** (логическое значение): `true`, если аккаунт голосования был активен хотя бы один раз в течение текущей эпохи.
  * **`commission`** (число): Размер комиссии в процентах (0–100), взимаемой валидатором.
  * **`lastVote`** (u64): Номер последнего слота, за который проголосовал этот валидатор.
  * **`rootSlot`** (u64): Последний слот, который узел считал корневым (полностью подтвержденным блоком, который не будет отменен).
  * **`epochCredits`** (массив): Массив массивов, каждый внутренний массив которого содержит `[epoch, credits_earned_in_epoch, previous_total_credits]`.
* **`delinquent`**: Массив объектов с той же структурой, что и `current`, представляющих валидаторов, которых узел считает неактивными.

**Пример фрагмента ответа:**

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": {
    "current": [
      {
        "commission": 10,
        "epochCredits": [[300, 12345, 567890]],
        "epochVoteAccount": true,
        "lastVote": 180000500,
        "nodePubkey": "NodePubkeyExample123...",
        "rootSlot": 180000450,
        "activatedStake": "50000000000000", // lamports
        "votePubkey": "VoteAccountPubkeyExample123..."
      }
      // ... more current validators
    ],
    "delinquent": [
      // ... delinquent validators, if any
    ]
  },
  "id": 1
}
```

## Примеры кода

<CodeGroup>
  ```bash cURL theme={"system"}
  # Get all current and delinquent vote accounts:
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getVoteAccounts"
    }' \
    <YOUR_RPC_URL>

  # Get a specific vote account:
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getVoteAccounts",
      "params": [
        {
          "votePubkey": "<SPECIFIC_VOTE_ACCOUNT_PUBKEY>"
        }
      ]
    }' \
    <YOUR_RPC_URL>

  # Get vote accounts with "confirmed" commitment and keep unstaked delinquents:
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getVoteAccounts",
      "params": [
        {
          "commitment": "confirmed",
          "keepUnstakedDelinquents": true
        }
      ]
    }' \
    <YOUR_RPC_URL>
  ```

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

  async function fetchVoteAccounts() {
    // Replace with your RPC endpoint
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');

    try {
      // Get all vote accounts
      const voteAccounts = await connection.getVoteAccounts();
      console.log(`Found ${voteAccounts.current.length} current validators.`);
      console.log(`Found ${voteAccounts.delinquent.length} delinquent validators.`);

      if (voteAccounts.current.length > 0) {
        console.log("\nFirst current validator details:");
        console.log(`  Vote Pubkey: ${voteAccounts.current[0].votePubkey}`);
        console.log(`  Node Pubkey: ${voteAccounts.current[0].nodePubkey}`);
        console.log(`  Activated Stake: ${voteAccounts.current[0].activatedStake} lamports`);
        console.log(`  Commission: ${voteAccounts.current[0].commission}%`);
        console.log(`  Last Vote: ${voteAccounts.current[0].lastVote}`);
        // console.log(JSON.stringify(voteAccounts.current[0], null, 2)); // For full details
      }

      // Get a specific vote account (replace with an actual vote account public key)
      // const specificVotePubkey = 'SPECIFIC_VOTE_ACCOUNT_PUBKEY';
      // const specificValidator = await connection.getVoteAccounts('confirmed', specificVotePubkey);
      // console.log(`\nDetails for ${specificVotePubkey}:`, JSON.stringify(specificValidator, null, 2));

    } catch (error) {
      console.error('Error fetching vote accounts:', error);
    }
  }

  fetchVoteAccounts();
  ```
</CodeGroup>

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

* **Большой объем ответа:** Этот метод может возвращать большой объем данных, особенно в сетях с большим количеством валидаторов, таких как Mainnet Beta. Учитывайте размер ответа и время его обработки.
* **Определение неактивности:** Определение понятия «неактивный» может зависеть от `delinquentSlotDistance` и представления узла. Валидатор может считаться неактивным на одном узле, но не на другом, если узлы по-разному определяют вершину реестра.
* **Активация стейка:** `activatedStake` отражает стейк, активный в текущей эпохе. Активация и деактивация стейка требуют времени.
* **Кредиты эпохи:** `epochCredits` содержит историю эффективности валидатора при получении кредитов за голосование.

В этом руководстве рассматривается метод RPC `getVoteAccounts`, с помощью которого вы можете запрашивать и анализировать информацию о валидаторах в сети Solana.


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