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

> Tìm hiểu các trường hợp sử dụng isBlockhashValid, 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 [`isBlockhashValid`](https://www.helius.dev/docs/api-reference/rpc/http/isblockhashvalid) kiểm tra xem một blockhash đã lấy trước đó có còn được mạng xem là hợp lệ hay không. Blockhash có thời hạn giới hạn (khoảng 2 phút hoặc 150 khối). Sau thời gian này, các giao dịch tham chiếu đến blockhash đó sẽ bị từ chối.

Phương thức này rất quan trọng đối với các ứng dụng lưu giữ blockhash một thời gian trước khi gửi giao dịch, nhằm đảm bảo giao dịch không thất bại do blockhash đã hết hạn.

**Lưu ý về phiên bản:** Phương thức này có trong `solana-core` phiên bản 1.9 trở lên. Đối với các nút chạy `solana-core` phiên bản 1.8 trở xuống, bạn nên sử dụng `getFeeCalculatorForBlockhash`. Ngoài thông tin về phí, phương thức này còn ngầm cho biết tính hợp lệ của blockhash (phương thức sẽ trả về lỗi nếu blockhash đã quá cũ).

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

* **Gửi lại giao dịch:** Trước khi thử lại một giao dịch thất bại, hãy kiểm tra xem blockhash ban đầu của giao dịch có còn hợp lệ hay không. Nếu không, bạn phải lấy một blockhash mới.
* **Ký giao dịch có độ trễ:** Nếu một giao dịch đã được chuẩn bị nhưng được ký và gửi sau đó, hãy xác minh tính hợp lệ của blockhash ngay trước khi gửi.
* **Xử lý giao dịch lạc quan:** Xác định xem một blockhash có khả năng được mạng chấp nhận hay không nếu giao dịch được gửi ngay lập tức.

## Tham số yêu cầu

1. **`blockhash`** (chuỗi, bắt buộc): Blockhash cần kiểm tra, ở dạng chuỗi được mã hóa base-58.
2. **`options`** (đối tượng, không bắt buộc): Một đối tượng cấu hình không bắt buộc có thể bao gồm:
   * **`commitment`** (chuỗi, không bắt buộc): Chỉ định [mức cam kết](https://www.helius.dev/blog/solana-commitment-levels) cho truy vấn (ví dụ: `"finalized"`, `"confirmed"`, `"processed"`). Nếu bỏ qua, mức cam kết mặc định của nút sẽ được sử dụng.
   * **`minContextSlot`** (u64, không bắt buộc): Slot tối thiểu mà tại đó yêu cầu có thể được đánh giá. Điều này đảm bảo nút RPC không phản hồi bằng trạng thái từ một slot cũ hơn `minContextSlot`.

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

Trường `result` trong phản hồi JSON-RPC là một đối tượng `RpcResponse` chứa:

* **`context`** (đối tượng): Một đối tượng chứa:
  * **`slot`** (u64): Slot mà tại đó nút RPC đã đánh giá tính hợp lệ của blockhash.
* **`value`** (boolean): `true` nếu blockhash vẫn hợp lệ, nếu không thì là `false`.

**Phản hồi mẫu (Blockhash hợp lệ):**

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

**Phản hồi mẫu (Blockhash không hợp lệ/đã hết hạn):**

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

## Ví dụ mã

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

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

* **Blockhash sẽ hết hạn:** Blockhash chỉ hợp lệ trong một khoảng thời gian giới hạn (khoảng 150 slot, tương đương khoảng 1–2 phút). Luôn lấy một blockhash mới nếu bạn không chắc chắn hoặc nếu đã trôi qua một khoảng thời gian đáng kể.
* **Cách sử dụng `minContextSlot`:** Sử dụng `minContextSlot` để tránh truy vấn một nút RPC chưa cập nhật. Nút này có thể trả về phản hồi "hợp lệ" đã lỗi thời cho một blockhash mà trên thực tế đã quá cũ theo góc nhìn của phần còn lại trong cụm.
* **Giải pháp thay thế cho các nút cũ hơn:** Đối với các nút chạy phiên bản Solana trước 1.9, hãy sử dụng `getFeeCalculatorForBlockhash("<YOUR_BLOCKHASH>")`. Nếu phương thức này trả về thành công thì blockhash hợp lệ. Nếu phương thức trả về lỗi (thường là do không tìm thấy blockhash hoặc blockhash đã quá cũ) thì blockhash không hợp lệ.
* **Xác nhận trên mạng:** Ngay cả khi `isBlockhashValid` trả về `true`, một giao dịch chỉ được hoàn tất sau khi đạt mức cam kết mong muốn trên mạng sau khi gửi.

Hướng dẫn này cung cấp các thông tin cần thiết để sử dụng hiệu quả phương thức RPC `isBlockhashValid` khi xây dựng ứng dụng Solana.

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

<CardGroup cols={2}>
  <Card title="getLatestBlockhash" href="/docs/vi/api-reference/rpc/http/getlatestblockhash">
    Lấy một blockhash mới cho các giao dịch mới
  </Card>
</CardGroup>
