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

# isBlockhashValidの使用法

> isBlockhashValidの使用例、コード例、リクエストパラメータ、応答構造、およびヒントを学ぶ。

[`isBlockhashValid`](https://www.helius.dev/docs/api-reference/rpc/http/isblockhashvalid) RPCメソッドは、以前に取得したブロックハッシュがネットワークによってまだ有効と見なされているかどうかを確認します。ブロックハッシュには限られた寿命（約2分、または150ブロック）があり、それ以降、それらを参照するトランザクションは拒否されます。

このメソッドは、トランザクションの送信前にしばらくブロックハッシュを保持するアプリケーションにとって重要であり、期限切れのブロックハッシュによるトランザクションの失敗を防ぐためです。

**バージョンノート:** このメソッドは`solana-core` v1.9以降で利用可能です。`solana-core` v1.8以前を実行しているノードの場合、`getFeeCalculatorForBlockhash`を使用する必要があります。これは、手数料情報に加えてブロックハッシュの有効性も暗黙的に示します（ブロックハッシュが古すぎる場合はエラーになります）。

## 一般的な使用ケース

* **トランザクションの再送信:** 失敗したトランザクションを再試行する前に、元のブロックハッシュがまだ有効であるか確認します。有効でない場合は、新しいブロックハッシュを取得する必要があります。
* **遅延トランザクション署名:** トランザクションが準備され、後で署名されて送信される場合は、送信直前にブロックハッシュの有効性を確認します。
* **楽観的トランザクション処理:** トランザクションを直ちに送信する場合、ブロックハッシュがネットワークによって受け入れられる可能性があるかどうかを確認します。

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

1. **`blockhash`** (string, 必須): チェックするブロックハッシュを、base-58 エンコードされた文字列として指定します。
2. **`options`** (object, オプション): オプションの設定オブジェクトには次を含めることができます:
   * **`commitment`** (string, オプション): クエリの[コミットメントレベル](https://www.helius.dev/blog/solana-commitment-levels)を指定します（例: `"finalized"`, `"confirmed"`, `"processed"`）。省略した場合、ノードのデフォルトのコミットメントが使用されます。
   * **`minContextSlot`** (u64, オプション): リクエストが評価されることができる最小スロットです。これにより、`minContextSlot`より古いスロットからのステータスでRPCノードが応答しないようにします。

## 応答構造

JSON-RPC応答内の`result`フィールドは、以下を含む`RpcResponse`オブジェクトです:

* **`context`** (object): 次を含むオブジェクト:
  * **`slot`** (u64): RPCノードがブロックハッシュの有効性を評価したスロット。
* **`value`** (boolean): ブロックハッシュがまだ有効であれば`true`、そうでなければ`false`。

**応答例 (有効なブロックハッシュ):**

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": {
    "context": { "slot": 180000500 },
    "value": true
  },
  "id": 1
}
```

**応答例 (無効/期限切れのブロックハッシュ):**

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "result": {
    "context": { "slot": 180000800 },
    "value": false
  },
  "id": 1
}
```

## コード例

<CodeGroup>
  ```bash cURL theme={"system"}
  # Check validity of a blockhash (replace <YOUR_BLOCKHASH>):
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "isBlockhashValid",
      "params": [
        "<YOUR_BLOCKHASH>"
      ]
    }' \
    <YOUR_RPC_URL>

  # Check with commitment and minContextSlot (replace <YOUR_BLOCKHASH>):
  curl -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "isBlockhashValid",
      "params": [
        "<YOUR_BLOCKHASH>",
        {
          "commitment": "confirmed",
          "minContextSlot": 170000000
        }
      ]
    }' \
    <YOUR_RPC_URL>
  ```

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

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

    try {
      console.log(`Checking validity of blockhash: ${blockhashToCheck}`);
      const result = await connection.isBlockhashValid(blockhashToCheck);
      
      console.log(`  Blockhash is valid: ${result.value}`);
      console.log(`  Checked at slot: ${result.context.slot}`);

      // Example with options
      // const resultWithOptions = await connection.isBlockhashValid(
      //   blockhashToCheck,
      //   { commitment: 'confirmed', minContextSlot: result.context.slot - 100 }
      // );
      // console.log(`\nWith options - Valid: ${resultWithOptions.value}, Slot: ${resultWithOptions.context.slot}`);

    } catch (error) {
      console.error(`Error checking blockhash ${blockhashToCheck}:`, error);
    }
  }

  // Example usage: First, get a recent blockhash
  async function getRecentBlockhashAndCheck() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    try {
      const { blockhash } = await connection.getLatestBlockhash();
      await checkBlockhash(blockhash); 
      
      // Example with a known old/invalid blockhash (will likely be false)
      // This blockhash is just an example and will be invalid.
      const oldBlockhash = 'J7rBdM6AecPDEZp8aPq5iPSNKVkU5Q76F3oAV4eW5wsW'; 
      // await checkBlockhash(oldBlockhash);

    } catch (error) {
      console.error('Error in example execution:', error);
    }
  }

  getRecentBlockhashAndCheck();
  ```
</CodeGroup>

## 開発者向けヒント

* **ブロックハッシュは期限切れになる:** ブロックハッシュは限られた時間（約150スロット、または約1～2分）のみ有効です。時間が経過した場合や不明な場合は、常に新鮮なブロックハッシュを取得してください。
* **`minContextSlot`の使用法:** ステールなRPCノードをクエリして実際には古すぎるブロックハッシュに対して「有効」な応答が得られるのを防ぐために、`minContextSlot`を使用します。
* **古いノードの代替手段:** Solanaバージョン1.9以前を実行しているノードの場合、`getFeeCalculatorForBlockhash("<YOUR_BLOCKHASH>")`を使用します。このメソッドが成功すればブロックハッシュは有効です。エラーが発生する（通常はブロックハッシュが見つからないか古すぎる場合）と、ブロックハッシュは無効です。
* **ネットワーク確認:** たとえ`isBlockhashValid`が`true`を返したとしても、トランザクションは送信後にネットワーク上の所望のコミットメントレベルに達して初めて最終決定されます。

このガイドは、Solanaアプリケーションを構築する際に`isBlockhashValid` RPCメソッドを効果的に使用するために必要な詳細を提供します。

## 関連メソッド

<CardGroup cols={2}>
  <Card title="getLatestBlockhash" href="/ja/api-reference/rpc/http/getlatestblockhash">
    新しいトランザクション用の最新のブロックハッシュを取得
  </Card>
</CardGroup>
