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

# getLeaderScheduleの使い方

> getLeaderScheduleのユースケース、コード例、リクエストパラメータ、応答構造、ヒントを学びます。

[`getLeaderSchedule`](https://www.helius.dev/docs/api-reference/rpc/http/getleaderschedule) RPCメソッドは、特定のエポックにおけるブロック生成のリーダーシップの割り当てをバリデータに対して返します。リーダースケジュールを理解することは、ネットワークの分析や、特定の時間にどのバリデータがブロックを生成するかの予測、特定のリーダーと連携するツールに役立ちます。

## 共通のユースケース

* **ネットワークモニタリング:** エポックにおけるバリデータ間のリーダースロットの分布を観察します。
* **トランザクションルーティング（高度な技術）:** 一部の高度なアプリケーションは、通常ネットワークとRPCノードが処理するものの、現在または今後のリーダーにトランザクションをルーティングしようとするかもしれません。
* **バリデータのパフォーマンス分析:** リーダースケジュールと実際のブロック生成を関連付けて、バリデータの稼働時間とパフォーマンスを評価します。
* **エポックの進行理解:** エポック全体を通じてどのバリデータがブロックの生成を担当しているかを確認します。

## リクエストパラメータ

このメソッドは最大2つのオプションパラメータを取ることができます:

1. **`slot`** (u64, optional): スロット番号。提供された場合、このスロットを含むエポックのリーダースケジュールが取得されます。`null`が提供されない場合、現在のエポックのリーダースケジュールが取得されます。
2. **`config`** (object, optional): 以下を含むことができる設定オブジェクト:

* **`commitment`** (string, optional): [コミットメントレベル](https://www.helius.dev/blog/solana-commitment-levels)を指定します。指定されない場合、ノードのデフォルトのコミットメントが使用されます。
* **`identity`** (string, optional): バリデータのbase-58エンコードされた公開鍵。指定された場合、返されるスケジュールにはこの特定のバリデータに割り当てられたスロットのみが含まれます。

## 応答構造

JSON-RPC応答の`result`フィールドは次のようになります:

* `null`: 要求された`slot`に対応するエポック（またはスロットが提供されていない場合の現在のエポック）が見つからない場合、またはそのリーダースケジュールが利用できない場合（例：計算されていない未来のエポック）。
* **オブジェクト**: スケジュールが見つかった場合。このオブジェクトはマップで、
* 各**キー**はバリデータのbase-58エンコードされた公開鍵（アイデンティティ）です。
* 対応する**値**は数値の配列です。それぞれの数値は、そのバリデータがリーダーであるエポックの開始からのスロットインデックスです。

例えば、エポックがスロット`1000`で始まり、バリデータがスケジュール内の`[0, 1, 5]`を持っている場合、そのバリデータはスロット`1000`、`1001`、`1005`のリーダーです。

## 例

### 1. 現在のエポックのリーダースケジュールを取得

この例は、現在のエポックの完全なリーダースケジュールを取得します。

<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. 特定のスロット内の特定のバリデータのリーダースケジュールを取得

この例は、スロット`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>

## 開発者向けのヒント

* **エポックの境界:** リーダースケジュールはエポック全体で固定されます。`getEpochInfo`を使用してエポックの開始および終了スロットを確認できます。
* **未来のエポック:** ネットワークがまだ計算していない遠い未来のエポックのスケジュールを要求する場合、`null`が返されることがあります。
* **相対スロットインデックス:** 応答にあるスロット番号は、ブロックチェーンの絶対スロット番号ではなく、要求されたエポックの最初のスロットに対する相対的なものです。
* **大きな応答:** アイデンティティフィルタなしでエポック全体のスケジュールを取得する場合、応答は大きくなる可能性があり、すべてのバリデータとその割り当てられたスロットがリストされます。

このガイドは、Solanaネットワーク上で特定のエポックにおけるブロック生成者の割り当てをクエリするために`getLeaderSchedule`を使用するための必要な情報を提供します。

## 関連メソッド

<CardGroup cols={2}>
  <Card title="getEpochInfo" href="/ja/api-reference/rpc/http/getepochinfo">
    スロット境界を含む現在のエポック情報を取得します
  </Card>

  <Card title="getSlotLeaders" href="/ja/api-reference/rpc/http/getslotleaders">
    特定のスロット範囲のリーダーを取得します
  </Card>
</CardGroup>
