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

> Tìm hiểu các trường hợp sử dụng, ví dụ mã, tham số yêu cầu, cấu trúc phản hồi và mẹo dành cho getSignatureStatuses.

Phương thức RPC [`getSignatureStatuses`](https://www.helius.dev/docs/api-reference/rpc/http/getsignaturestatuses) cho phép bạn truy xuất trạng thái xử lý và xác nhận của một danh sách chữ ký giao dịch. Phương thức này hữu ích để xác định liệu các giao dịch đã được mạng [xử lý, xác nhận hay hoàn tất](https://www.helius.dev/blog/solana-commitment-levels) hay chưa.

Trừ khi tùy chọn `searchTransactionHistory` được bật, phương thức này chủ yếu truy vấn bộ nhớ đệm trạng thái gần đây trên nút RPC. Đối với các giao dịch cũ hơn, việc bật `searchTransactionHistory` là rất quan trọng.

<Warning>
  **Tránh xử lý theo lô để có hiệu suất tốt hơn**

  Xử lý các phương thức lưu trữ theo lô làm tăng đáng kể độ trễ. Không cho phép lô có hơn 10 yêu cầu.
</Warning>

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

* **Xác nhận tính hoàn tất của giao dịch:** Xác minh liệu một giao dịch đã gửi có đạt đến mức xác nhận mong muốn hay chưa (ví dụ: `confirmed` hoặc `finalized`).
* **Tra cứu trạng thái theo lô:** Kiểm tra hiệu quả trạng thái của nhiều giao dịch cùng lúc, chẳng hạn như sau khi gửi theo lô.
* **Cập nhật giao diện người dùng dựa trên trạng thái giao dịch:** Hiển thị trạng thái theo thời gian thực của giao dịch cho người dùng.
* **Kiểm tra lỗi:** Xác định xem có giao dịch nào trong danh sách thất bại hay không và nguyên nhân thất bại.

## Tham số yêu cầu

1. **`signatures`** (`array` gồm các `string`): (Bắt buộc) Một mảng gồm các chữ ký giao dịch được mã hóa base-58. Bạn có thể truy vấn tối đa 256 chữ ký trong một yêu cầu.
2. **`options`** (`object`, không bắt buộc): Một đối tượng cấu hình không bắt buộc có trường sau:
   * **`searchTransactionHistory`** (`boolean`, không bắt buộc): Nếu là `true`, nút RPC sẽ tìm kiếm các chữ ký trong toàn bộ lịch sử giao dịch. Nếu là `false` (mặc định), nút chỉ tìm kiếm trong bộ nhớ đệm trạng thái gần đây. Đối với các giao dịch cũ hoặc có khả năng đã bị loại bỏ, hãy đặt giá trị này thành `true`.

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

Trường `result` của phản hồi JSON-RPC chứa một đối tượng có hai trường:

* **`context`** (`object`): Một đối tượng chứa:
  * **`slot`** (`u64`): Slot mà nút RPC đã xử lý yêu cầu này.
* **`value`** (`array` gồm các `object` | `null`): Một mảng các đối tượng trạng thái, tương ứng với thứ tự chữ ký trong yêu cầu. Mỗi phần tử có thể là:
  * Một **đối tượng** có các trường sau nếu tìm thấy chữ ký:
    * **`slot`** (`u64`): Slot mà giao dịch được xử lý.
    * **`confirmations`** (`number` | `null`): Số khối đã được xác nhận kể từ khi giao dịch được xử lý. Giá trị là `null` nếu giao dịch đã hoàn tất (vì trạng thái hoàn tất đồng nghĩa giao dịch sẽ không bị đảo ngược, nên số lượng xác nhận cụ thể không còn quan trọng).
    * **`err`** (`object` | `null`): Một đối tượng lỗi nếu giao dịch thất bại (ví dụ: `{"InstructionError":[0,{"Custom":1}]}`), hoặc `null` nếu giao dịch thành công.
    * **`status`** (`object`): Một đối tượng cho biết trạng thái thực thi của giao dịch. Thường là `{"Ok":null}` đối với giao dịch thành công hoặc một đối tượng trình bày chi tiết lỗi đối với giao dịch thất bại.
    * **`confirmationStatus`** (`string` | `null`): Trạng thái xác nhận của cụm đối với giao dịch (ví dụ: `processed`, `confirmed`, `finalized`). Có thể là `null` nếu trạng thái không có trong bộ nhớ đệm và `searchTransactionHistory` là false.
  * **`null`**: Nếu không tìm thấy chữ ký trong bộ nhớ đệm trạng thái và `searchTransactionHistory` là `false` (hoặc chữ ký thực sự không tồn tại ngay cả khi tìm kiếm trong lịch sử).

## Ví dụ

### 1. Lấy trạng thái cho danh sách chữ ký (bộ nhớ đệm gần đây)

Ví dụ này truy xuất trạng thái của hai chữ ký bằng cách sử dụng bộ nhớ đệm gần đây của nút.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  # Replace with actual transaction signatures
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getSignatureStatuses",
      "params": [
        [
          "5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW",
          "2x5YfV29N4p9K2kEFK2gFfC5T5acbs2z2MytTZqrgq17pYjCMfYjW4sAUpkWMkMzxGztD2Qv5v7n92uYJcQY9c7a" 
        ]
      ]
    }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  // Replace <api-key> with your Helius API key
  const { Connection } = require('@solana/web3.js');

  async function checkRecentSignatures() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const signatures = [
      '5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW',
      '2x5YfV29N4p9K2kEFK2gFfC5T5acbs2z2MytTZqrgq17pYjCMfYjW4sAUpkWMkMzxGztD2Qv5v7n92uYJcQY9c7a' // Replace with another signature
    ];

    try {
      const response = await connection.getSignatureStatuses(signatures);
      console.log("RPC Response Context Slot:", response.context.slot);
      response.value.forEach((status, index) => {
        console.log(`--- Status for Signature ${index + 1} (${signatures[index].substring(0,10)}...) ---`);
        if (status) {
          console.log(`  Slot: ${status.slot}`);
          console.log(`  Confirmations: ${status.confirmations === null ? 'Finalized (or N/A)' : status.confirmations}`);
          console.log(`  Error: ${JSON.stringify(status.err)}`);
          console.log(`  Execution Status: ${JSON.stringify(status.status)}`);
          console.log(`  Confirmation Status: ${status.confirmationStatus}`);
        } else {
          console.log('  Status not found (likely not in recent cache or does not exist).');
        }
      });
    } catch (error) {
      console.error('Error fetching signature statuses:', error);
    }
  }

  checkRecentSignatures();
  ```
</CodeGroup>

### 2. Lấy trạng thái bằng cách tìm kiếm trong lịch sử giao dịch

Ví dụ này truy xuất trạng thái của các chữ ký và yêu cầu rõ ràng nút tìm kiếm trong lịch sử giao dịch.

<CodeGroup>
  ```bash cURL theme={"system"}
  # Replace <api-key> with your Helius API key
  # Replace with actual transaction signatures
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getSignatureStatuses",
      "params": [
        [
          "3jPTfHcbzWHeD4jW8q4Y8g3h2D1aBwM81y1sHhDqYQ7Z9x5n7cVy2gD8QWbK9eXwSjJ6aA7FzV2kLpQoEwU9jX", 
          "4SyzjM2fTALqTNjLKMM1yG1bW7kCFu2GvEkKcvKChG9o1KjQW8jLdZ6sWfN9mP1pU3rD7XvA6B2CjHkLwRzYxTnX"  
        ],
        {
          "searchTransactionHistory": true
        }
      ]
    }'
  ```

  ```javascript JavaScript (using @solana/web3.js) theme={"system"}
  // Replace <api-key> with your Helius API key
  const { Connection } = require('@solana/web3.js');

  async function checkSignaturesWithHistory() {
    const connection = new Connection('https://mainnet.helius-rpc.com/?api-key=<api-key>');
    const signatures = [
      // Replace with a signature you know is older or might have been dropped
      '3jPTfHcbzWHeD4jW8q4Y8g3h2D1aBwM81y1sHhDqYQ7Z9x5n7cVy2gD8QWbK9eXwSjJ6aA7FzV2kLpQoEwU9jX',
      // Replace with another valid signature
      '4SyzjM2fTALqTNjLKMM1yG1bW7kCFu2GvEkKcvKChG9o1KjQW8jLdZ6sWfN9mP1pU3rD7XvA6B2CjHkLwRzYxTnX' 
    ];

    try {
      const response = await connection.getSignatureStatuses(signatures, { searchTransactionHistory: true });
      console.log("RPC Response Context Slot:", response.context.slot);
      response.value.forEach((status, index) => {
        console.log(`--- Status for Signature ${index + 1} (${signatures[index].substring(0,10)}...) ---`);
        if (status) {
          console.log(`  Slot: ${status.slot}`);
          console.log(`  Confirmations: ${status.confirmations === null ? 'Finalized (or N/A)' : status.confirmations}`);
          console.log(`  Error: ${JSON.stringify(status.err)}`);
          console.log(`  Execution Status: ${JSON.stringify(status.status)}`);
          console.log(`  Confirmation Status: ${status.confirmationStatus}`);
        } else {
          console.log('  Status not found (even with history search, it might not exist or is too old).');
        }
      });
    } catch (error) {
      console.error('Error fetching signature statuses with history:', error);
    }
  }

  checkSignaturesWithHistory();
  ```
</CodeGroup>

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

* **`searchTransactionHistory`:** Rất quan trọng đối với độ tin cậy. Nếu là `false` (mặc định), phương thức chỉ kiểm tra một bộ nhớ đệm gần đây có giới hạn. Nếu một giao dịch đã cũ hoặc có khả năng bị loại bỏ và không có trong bộ nhớ đệm này, phương thức sẽ trả về `null` cho trạng thái của chữ ký đó. Luôn đặt thành `true` nếu cần xác nhận trạng thái của những giao dịch có thể không còn mới.
* **Giới hạn chữ ký:** Bạn có thể truy vấn tối đa 256 chữ ký cho mỗi lần gọi.
* **Trạng thái `null`:** Giá trị `null` trong mảng `value` của một chữ ký nhất định có nghĩa là không tìm thấy trạng thái của chữ ký đó. Nguyên nhân có thể là chữ ký không nằm trong bộ nhớ đệm gần đây (nếu `searchTransactionHistory` là false), giao dịch chưa bao giờ được ghi nhận hoặc giao dịch quá cũ so với lịch sử của nút ngay cả khi sử dụng `searchTransactionHistory: true`.
* **`confirmations: null`**: Điều này thường có nghĩa là giao dịch đã đạt trạng thái `finalized`. Tại thời điểm này, số lượng xác nhận cụ thể không còn quá quan trọng vì khối được xem là không thể đảo ngược.
* **Xử lý lỗi:** Kiểm tra trường `err` trong từng đối tượng trạng thái để xác định xem giao dịch có thất bại hay không. Trường `status` cũng sẽ cung cấp thông tin chi tiết (ví dụ: `{"Err":...}`).

Sử dụng `getSignatureStatuses` là một cách hiệu quả để theo dõi trạng thái của nhiều giao dịch Solana. Hãy nhớ sử dụng `searchTransactionHistory: true` để kiểm tra trạng thái một cách đáng tin cậy.
