> ## 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 的使用案例、代码示例、请求参数、响应结构和提示。

[此](https://www.helius.dev/docs/api-reference/rpc/http/isblockhashvalid) RPC 方法检查先前获得的 blockhash 是否仍被网络视为有效。Blockhash 的生命周期有限（大约 2 分钟或 150 个区块），之后引用它们的交易将被拒绝。

此方法对于在提交交易前保留 blockhash 一段时间的应用程序至关重要，以确保交易不会因 blockhash 过期而失败。

**版本说明：** 此方法在 v1.9 及更新版本中可用。对于运行 v1.8 或更旧版本的节点，您应使用此方法，该方法除了提供费用信息外，还隐含指示 blockhash 的有效性（如果 blockhash 太旧，将出现错误）。

## 常见用例

* **交易重试：** 在重试失败的交易之前，检查其原始 blockhash 是否仍然有效。如果无效，则必须获取新的 blockhash。
* **延迟交易签名：** 如果交易已准备好但稍后才签名和提交，请在提交前验证 blockhash 的有效性。
* **乐观交易处理：** 确定如果立即发送交易，blockhash 是否可能被网络接受。

## 请求参数

1. **（string，必需）：** 要检查的 blockhash，作为 base-58 编码的字符串。
2. **（object，可选）：** 一个可选的配置对象，可以包括：
   * **（string，可选）：** 指定查询的[承诺级别](https://www.helius.dev/blog/solana-commitment-levels)（例如，）。如果省略，则使用节点的默认承诺。
   * **（u64，可选）：** 请求可以评估的最低插槽。这确保了 RPC 节点不会返回来自比该插槽更早的状态。

## 响应结构

JSON-RPC 响应中的字段是包含以下内容的对象：

* **（object）：** 包含：
  * **（u64）：** RPC 节点评估 blockhash 有效性的插槽。
* **（boolean）：** 如果 blockhash 仍然有效，则为 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>

## 开发者提示

* **Blockhash过期：** Blockhash仅在有限时间内有效（大约150个槽位，或约1-2分钟）。如果不确定或已经过去了相当长的时间，请始终获取新的blockhash。
* **`minContextSlot`用法：** 使用`minContextSlot`来防止查询过期的RPC节点，该节点可能会对实际上对集群其余部分来说太旧的blockhash给出过时的"有效"响应。
* **旧节点的替代方案：** 对于运行低于Solana 1.9版本的节点，使用`getFeeCalculatorForBlockhash("<YOUR_BLOCKHASH>")`。如果此方法成功返回，blockhash有效。如果出现错误（通常是因为blockhash未找到或太旧），则blockhash无效。
* **网络确认：** 即使`isBlockhashValid`返回`true`，只有在提交后达到网络所需的承诺级别后，事务才最终确定。

本指南提供了在构建Solana应用程序时有效使用`isBlockhashValid` RPC方法所需的详细信息。

## 相关方法

<CardGroup cols={2}>
  <Card title="getLatestBlockhash" href="/docs/zh/api-reference/rpc/http/getlatestblockhash">
    获取新交易的最新blockhash
  </Card>
</CardGroup>
