> ## 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`** (문자열, 필수): base-58로 인코딩된 검사할 블록해시입니다.
2. **`options`** (객체, 선택 사항): 다음을 포함할 수 있는 선택적 구성 객체:
   * **`commitment`** (문자열, 선택 사항): 쿼리에 대한 [커밋 수준](https://www.helius.dev/blog/solana-commitment-levels)을 지정합니다 (예: `"finalized"`, `"confirmed"`, `"processed"`). 생략하면 노드의 기본 커밋이 사용됩니다.
   * **`minContextSlot`** (u64, 선택 사항): 요청이 평가될 수 있는 최소 슬롯입니다. 이는 RPC 노드가 `minContextSlot`보다 오래된 슬롯의 상태로 응답하지 않도록 보장합니다.

## 응답 구조

JSON-RPC 응답의 `result` 필드는 `RpcResponse` 객체를 포함합니다:

* **`context`** (객체): 다음을 포함하는 객체:
  * **`slot`** (u64): RPC 노드가 블록해시 유효성을 평가한 슬롯입니다.
* **`value`** (부울): 블록해시가 여전히 유효하면 `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="/docs/ko/api-reference/rpc/http/getlatestblockhash">
    새로운 트랜잭션을 위한 최신 블록해시 가져오기
  </Card>
</CardGroup>
