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

# Cách sử dụng getLeaderSchedule

> Tìm hiểu các trường hợp sử dụng getLeaderSchedule, ví dụ mã, tham số yêu cầu, cấu trúc phản hồi và mẹo.

Phương thức RPC [`getLeaderSchedule`](https://www.helius.dev/docs/api-reference/rpc/http/getleaderschedule) trả về thông tin phân công quyền tạo khối cho các trình xác thực trong một epoch cụ thể. Việc hiểu lịch trình leader có thể hữu ích khi phân tích mạng, dự đoán trình xác thực nào sẽ tạo khối tại những thời điểm nhất định hoặc xây dựng các công cụ tương tác với những leader cụ thể.

## Các trường hợp sử dụng phổ biến

* **Giám sát mạng:** Quan sát sự phân bổ các slot leader giữa các trình xác thực trong một epoch.
* **Định tuyến giao dịch (Nâng cao):** Một số ứng dụng nâng cao có thể thử định tuyến giao dịch đến leader hiện tại hoặc sắp tới, mặc dù việc này thường do mạng và các node RPC xử lý.
* **Phân tích hiệu suất trình xác thực:** Đối chiếu lịch trình leader với hoạt động tạo khối thực tế để đánh giá thời gian hoạt động và hiệu suất của trình xác thực.
* **Hiểu tiến trình của epoch:** Xem các trình xác thực chịu trách nhiệm tạo khối trong suốt một epoch.

## Tham số yêu cầu

Phương thức này có thể nhận tối đa hai tham số tùy chọn:

1. **`slot`** (u64, tùy chọn): Số slot. Nếu được cung cấp, hệ thống sẽ truy xuất lịch trình leader của epoch chứa slot này. Nếu là `null` hoặc bị bỏ qua, hệ thống sẽ truy xuất lịch trình leader của epoch hiện tại.
2. **`config`** (đối tượng, tùy chọn): Đối tượng cấu hình có thể chứa:
   * **`commitment`** (chuỗi, tùy chọn): Chỉ định [mức commitment](https://www.helius.dev/blog/solana-commitment-levels). Nếu không được cung cấp, commitment mặc định của node sẽ được sử dụng.
   * **`identity`** (chuỗi, tùy chọn): Khóa công khai của trình xác thực được mã hóa base-58. Nếu được cung cấp, lịch trình trả về sẽ chỉ bao gồm các slot được gán cho trình xác thực cụ thể này.

## Cấu trúc phản hồi

Trường `result` trong phản hồi JSON-RPC sẽ là:

* `null`: Nếu không tìm thấy epoch tương ứng với `slot` được yêu cầu (hoặc epoch hiện tại nếu không cung cấp slot), hoặc nếu lịch trình leader của epoch đó không khả dụng (ví dụ: một epoch trong tương lai chưa được tính toán).
* Một **đối tượng**: Nếu tìm thấy lịch trình. Đối tượng này là một ánh xạ, trong đó:
  * Mỗi **khóa** là khóa công khai (danh tính) của một trình xác thực được mã hóa base-58.
  * **Giá trị** tương ứng là một mảng số. Mỗi số là chỉ mục slot *tính tương đối từ đầu epoch* mà trình xác thực đó giữ vai trò leader.

Ví dụ: nếu một epoch bắt đầu tại slot `1000` và một trình xác thực có `[0, 1, 5]` trong lịch trình, điều đó có nghĩa là trình xác thực này là leader của các slot `1000`, `1001` và `1005`.

## Ví dụ

### 1. Lấy lịch trình leader của epoch hiện tại

Ví dụ này truy xuất toàn bộ lịch trình leader của epoch hiện tại.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getLeaderSchedule"
    }'
  ```

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

  async function fetchCurrentLeaderSchedule() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    try {
      const leaderSchedule = await connection.getLeaderSchedule(); // Fetches for current epoch by default
      if (leaderSchedule) {
        console.log('Leader Schedule for Current Epoch:');
        for (const [validatorIdentity, slots] of Object.entries(leaderSchedule)) {
          console.log(`  Validator: ${validatorIdentity}`);
          console.log(`    Slots (relative to epoch start): ${slots.join(', ')}`);
        }
      } else {
        console.log('Leader schedule for the current epoch not found or not yet available.');
      }
      // console.log(JSON.stringify(leaderSchedule, null, 2));
    } catch (error) {
      console.error('Error fetching leader schedule:', error);
    }
  }

  fetchCurrentLeaderSchedule();
  ```
</CodeGroup>

### 2. Lấy lịch trình leader của một trình xác thực cụ thể trong một epoch cụ thể (theo slot)

Ví dụ này truy xuất lịch trình leader của một danh tính trình xác thực nhất định trong epoch chứa slot `200000`.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  # Replace VALIDATOR_PUBKEY with an actual validator identity public key
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getLeaderSchedule",
      "params": [
        200000,
        { "identity": "VALIDATOR_PUBKEY" }
      ]
    }'
  ```

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

  async function fetchValidatorEpochSchedule() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const targetSlot = 200000;
    const validatorIdentity = 'VALIDATOR_PUBKEY'; // e.g., 'Vote111111111111111111111111111111111111111'

    try {
      const leaderSchedule = await connection.getLeaderSchedule(targetSlot, { identity: validatorIdentity });
      if (leaderSchedule && leaderSchedule[validatorIdentity]) {
        console.log(`Leader Schedule for Validator ${validatorIdentity} in epoch of slot ${targetSlot}:`);
        console.log(`  Slots (relative to epoch start): ${leaderSchedule[validatorIdentity].join(', ')}`);
      } else {
        console.log(`No leader slots found for validator ${validatorIdentity} in epoch of slot ${targetSlot}, or schedule not available.`);
      }
      // console.log(JSON.stringify(leaderSchedule, null, 2));
    } catch (error) {
      console.error('Error fetching validator leader schedule:', error);
    }
  }

  fetchValidatorEpochSchedule();
  ```
</CodeGroup>

## Mẹo dành cho nhà phát triển

* **Ranh giới epoch:** Lịch trình leader được cố định trong toàn bộ một epoch. Bạn có thể sử dụng `getEpochInfo` để tìm slot bắt đầu và kết thúc của một epoch.
* **Các epoch trong tương lai:** Việc yêu cầu lịch trình của một epoch ở tương lai xa có thể trả về `null` nếu mạng chưa tính toán epoch đó.
* **Chỉ mục slot tương đối:** Hãy nhớ rằng số slot trong phản hồi được tính tương đối so với slot đầu tiên của epoch *được yêu cầu*, không phải số slot tuyệt đối trên blockchain.
* **Phản hồi lớn:** Đối với lịch trình đầy đủ của một epoch mà không có bộ lọc danh tính, phản hồi có thể rất lớn vì liệt kê tất cả trình xác thực và các slot được gán cho họ.

Hướng dẫn này cung cấp thông tin cần thiết để sử dụng `getLeaderSchedule` nhằm truy vấn thông tin phân công trình tạo khối cho bất kỳ epoch nào trên mạng Solana.

## Các phương thức liên quan

<CardGroup cols={2}>
  <Card title="getEpochInfo" href="/docs/vi/api-reference/rpc/http/getepochinfo">
    Lấy thông tin epoch hiện tại, bao gồm các ranh giới slot
  </Card>

  <Card title="getSlotLeaders" href="/docs/vi/api-reference/rpc/http/getslotleaders">
    Lấy các leader cho một phạm vi slot cụ thể
  </Card>
</CardGroup>
