> ## 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 사용 사례, 코드 예제, 요청 매개변수, 응답 구조 및 팁을 배웁니다.

[`getVoteAccounts`](https://www.helius.dev/docs/api-reference/rpc/http/getvoteaccounts) RPC 메소드는 현재 은행의 모든 투표 계정(검증자)에 대한 정보를 반환합니다. 이는 `current` (활성) 및 `delinquent` 검증자를 구분하고, 그들의 스테이크, 투표 활동 및 정체성에 대한 세부 정보를 제공합니다.

## 일반적인 사용 사례

* **검증자 모니터링:** 네트워크 상의 검증자의 상태, 스테이크 및 성능 추적.
* **스테이킹 대시보드:** SOL을 위임하려는 사용자를 위해 사용 가능한 검증자 정보를 표시.
* **네트워크 건강 분석:** 스테이크 분포 및 검증자 활동을 조사하여 네트워크의 전반적인 건강 및 분산도를 평가.
* **비정상 검증자 식별:** 합의에 적극적으로 참여하지 않는 검증자를 찾습니다.

## 요청 매개변수

이 메소드는 다음 필드를 포함하는 선택적 구성 객체를 허용합니다:

1. **`commitment`** (string, optional): 쿼리의 [커밋 수준](https://www.helius.dev/blog/solana-commitment-levels)을 지정합니다 (예: `"finalized"`, `"confirmed"`, `"processed"`). 생략할 경우 노드의 기본 커밋이 사용됩니다.
2. **`votePubkey`** (string, optional): 제공된 경우, 결과는 지정된 검증자 투표 계정 주소 (base-58 인코딩)만 포함하도록 필터링됩니다.
3. **`keepUnstakedDelinquents`** (boolean, optional): 기본값은 `false`입니다. `true`로 설정하면 `delinquent` 목록에 활성화된 스테이크가 없는 검증자가 포함됩니다. 그렇지 않으면 필터링됩니다.
4. **`delinquentSlotDistance`** (u64, optional): 검증자가 장부의 팁에 뒤쳐져 비정상으로 간주되는 슬롯 수를 지정합니다. 지정하지 않으면 노드는 기본값을 사용합니다.

## 응답 구조

JSON-RPC 응답의 `result` 필드는 두 개의 배열이 포함된 객체입니다:

* **`current`**: 각 객체가 다음 필드를 포함하는 활성 투표 계정을 나타내는 객체 배열:
  * **`votePubkey`** (string): 투표 계정 주소 (base-58 인코딩).
  * **`nodePubkey`** (string): 검증자 노드의 공개 키 (base-58 인코딩).
  * **`activatedStake`** (u64): 이 투표 계정에 위임되고 현재 에포크에서 활성화된 lamports 수.
  * **`epochVoteAccount`** (boolean): 현재 에포크 동안 최소한 한 번 활성화된 경우 `true`.
  * **`commission`** (number): 검증자가 부과하는 커미션 비율 (0-100).
  * **`lastVote`** (u64): 이 검증자가 가장 최근에 투표한 슬롯 번호.
  * **`rootSlot`** (u64): 노드가 루트로 간주하는 마지막 슬롯 (완전히 확인되고 롤백되지 않을 블록).
  * **`epochCredits`** (array): 각 내부 배열에 `[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`는 투표를 통해 신용을 얻는 검증자의 성과 이력을 제공합니다.

이 가이드는 `getVoteAccounts` RPC 메소드를 다루며, 이를 통해 Solana 네트워크의 검증자 정보를 쿼리하고 이해할 수 있습니다.
