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

> Tìm hiểu các trường hợp sử dụng getBlock, 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 [`getBlock`](https://www.helius.dev/docs/api-reference/rpc/http/getblock) cho phép bạn truy xuất thông tin chi tiết về một khối đã được xác nhận trong sổ cái Solana. Phương thức này rất cần thiết cho trình khám phá khối, phân tích lịch sử giao dịch và tìm hiểu trạng thái của chuỗi tại một thời điểm cụ thể.

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

  Việc 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 các lô có hơn 10 yêu cầu.
</Warning>

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

* **Kiểm tra nội dung khối:** Xem tất cả giao dịch có trong một [khối](https://www.helius.dev/blog/solana-slots-blocks-and-epochs) cụ thể.
* **Truy xuất mã băm khối:** Lấy mã băm khối của một slot nhất định, mã băm khối của khối cha và slot cha.
* **Kiểm tra chiều cao và thời gian của khối:** Xác định chiều cao của khối (số thứ tự của khối) và thời gian tạo ước tính.
* **Phân tích chi tiết giao dịch:** Với các tham số phù hợp, bạn có thể lấy toàn bộ dữ liệu giao dịch, bao gồm siêu dữ liệu như phí, trạng thái, số dư trước/sau và các lệnh nội bộ.
* **Truy xuất phần thưởng:** Tùy chọn đưa thông tin phần thưởng của khối vào kết quả.

## Tham số

1. `slot` (số, bắt buộc): Số slot của khối cần truy vấn (u64).

2. `config` (đối tượng, tùy chọn): Một đối tượng cấu hình có các trường sau:
   * `commitment` (chuỗi, tùy chọn): Chỉ định [mức cam kết](https://www.helius.dev/blog/solana-commitment-levels) cần sử dụng. Phương thức này không hỗ trợ `processed`. Mặc định là `finalized`.
   * `encoding` (chuỗi, tùy chọn): Kiểu mã hóa cho dữ liệu giao dịch. Mặc định là `json` nếu `transactionDetails` là `full` hoặc `accounts`; nếu không, mặc định là `base64`.
     * `json`: Trả về dữ liệu giao dịch và tài khoản ở định dạng JSON (không còn được khuyến nghị, hãy dùng `jsonParsed`).
     * `jsonParsed`: Trả về dữ liệu giao dịch và tài khoản dưới dạng JSON đã phân tích. Đây là lựa chọn được khuyến nghị vì bao gồm tất cả khóa tài khoản của giao dịch (kể cả những khóa từ Bảng tra cứu địa chỉ).
     * `base58` (chậm)
     * `base64`
     * `base64+zstd`
   * `transactionDetails` (chuỗi, tùy chọn): Chỉ định mức độ chi tiết của giao dịch cần trả về. Mặc định là `full`.
     * `full`: Trả về đầy đủ thông tin giao dịch, bao gồm siêu dữ liệu giao dịch.
     * `accounts`: Trả về danh sách tài khoản được nêu chi tiết trong mỗi giao dịch, nhưng không trả về toàn bộ dữ liệu hoặc siêu dữ liệu giao dịch.
     * `signatures`: Chỉ trả về chữ ký giao dịch.
     * `none`: Không trả về thông tin chi tiết giao dịch.
   * `rewards` (boolean, tùy chọn): Có đưa mảng phần thưởng vào phản hồi hay không. Mặc định là `false`.
   * `maxSupportedTransactionVersion` (số, tùy chọn): Phiên bản giao dịch tối đa cần trả về. Nếu khối chứa giao dịch có phiên bản cao hơn, yêu cầu sẽ thất bại với lỗi JSON-RPC `-32015`. Nếu bỏ qua, chỉ các giao dịch cũ được trả về và khối có bất kỳ giao dịch được đánh phiên bản nào cũng sẽ gây ra lỗi. Đặt thành `1` để bao gồm giao dịch cũ, v0 (Bảng tra cứu địa chỉ) và v1. Xem [Hỗ trợ giao dịch v1](/docs/vi/rpc/transaction-v1).

## Phản hồi

Nếu khối được chỉ định đã được xác nhận và tìm thấy, trường `result` sẽ là một đối tượng chứa thông tin về khối. Nếu không tìm thấy hoặc khối chưa được xác nhận, `result` sẽ là `null`.

Các trường chính trong đối tượng khối bao gồm:

* `blockhash` (chuỗi): Mã băm khối được mã hóa bằng base-58 của khối này.
* `previousBlockhash` (chuỗi): Mã băm khối được mã hóa bằng base-58 của khối trước đó. Nếu khối cha không khả dụng (do dọn dẹp sổ cái), giá trị này có thể là ID chương trình hệ thống.
* `parentSlot` (số): Số slot của khối cha.
* `transactions` (mảng): Một mảng các đối tượng giao dịch có trong khối. Cấu trúc của các đối tượng này phụ thuộc vào các tham số `encoding` và `transactionDetails`.
  * Mỗi đối tượng giao dịch thường chứa `meta` (siêu dữ liệu như phí, trạng thái, nhật ký và số dư trước/sau) và `transaction` (dữ liệu giao dịch thực tế, bao gồm thông điệp và chữ ký).
* `rewards` (mảng, tùy chọn): Một mảng các đối tượng phần thưởng, xuất hiện nếu `rewards: true` được chỉ định. Mỗi đối tượng trình bày chi tiết `pubkey`, `lamports`, `postBalance`, `rewardType` và có thể cả `commission`.
* `blockTime` (số | null): Thời gian tạo ước tính của khối dưới dạng dấu thời gian Unix (số giây kể từ epoch), hoặc `null` nếu không khả dụng.
* `blockHeight` (số | null): Chiều cao của khối này (số khối đứng trước nó trong chuỗi bắt nguồn từ slot 0), hoặc `null` nếu không khả dụng.

Tham khảo tài liệu RPC chính thức của Solana để biết cấu trúc đầy đủ và chi tiết của các đối tượng giao dịch và siêu dữ liệu trong phản hồi.

## Ví dụ: Truy xuất thông tin khối

Hãy thử truy xuất thông tin cho một số slot minh họa trên Devnet.
**Quan trọng:** Các số slot được xử lý rất nhanh. Số slot được dùng bên dưới (`250000000`) là giá trị giữ chỗ. Khi chạy ví dụ, bạn nên thay số này bằng một slot gần đây đã được xác nhận mà bạn biết là tồn tại trên mạng đích (ví dụ: Devnet hoặc Mainnet). Bạn có thể tìm các số slot gần đây bằng trình khám phá khối Solana.

**Lưu ý:** Thay `YOUR_API_KEY` bằng khóa API Helius thực tế của bạn trong các ví dụ dưới đây.

<CodeGroup>
  ```bash curl theme={"system"}
  # Replace 250000000 with a valid, recent slot number on Devnet/Mainnet
  curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY -X POST -H "Content-Type: application/json" -d \
  '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "getBlock",
    "params": [
      250000000, 
      {
        "encoding": "jsonParsed",
        "transactionDetails": "full",
        "rewards": true,
        "maxSupportedTransactionVersion": 1
      }
    ]
  }'
  ```

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

  async function getBlockDetails() {
    const rpcUrl = 'https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY'; // Replace YOUR_API_KEY
    const connection = new Connection(rpcUrl, 'confirmed');
    
    // Replace with a valid, recent slot number on your target network
    const slotToQuery = 250000000; 

    try {
      const block = await connection.getBlock(slotToQuery, {
        encoding: "jsonParsed",
        transactionDetails: "full",
        rewards: true,
        maxSupportedTransactionVersion: 1 
      });

      if (block) {
        console.log('Block Details:');
        console.log(`   Slot: ${slotToQuery}`);
        console.log(`   Blockhash: ${block.blockhash}`);
        console.log(`   Previous Blockhash: ${block.previousBlockhash}`);
        console.log(`   Parent Slot: ${block.parentSlot}`);
        console.log(`   Block Height: ${block.blockHeight !== null ? block.blockHeight : 'N/A'}`);
        console.log(`   Block Time: ${block.blockTime ? new Date(block.blockTime * 1000).toISOString() : 'N/A'}`);
        console.log(`   Transactions Count: ${block.transactions.length}`);
        // console.log('   Transactions:', JSON.stringify(block.transactions, null, 2)); // Full transaction details
        // console.log('   Rewards:', JSON.stringify(block.rewards, null, 2)); // Reward details
      } else {
        console.log(`Block at slot ${slotToQuery} not found or not confirmed.`);
      }
    } catch (error) {
      console.error(`Error fetching block ${slotToQuery}:`, error);
    }
  }

  getBlockDetails();
  ```

  ```typescript Kit theme={"system"}
  import { createSolanaRpc } from "@solana/kit";

  const rpc_url = "https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY";
  const rpc = createSolanaRpc(rpc_url);

  const slot_number = BigInt(377261141);

  let block = await rpc
    .getBlock(
      slot_number,
      {
        commitment: "finalized",
        encoding: "json",
        transactionDetails: "full",
        maxSupportedTransactionVersion: 1,
        rewards: false,
      },
    )
    .send();

  console.log("block:", block);
  ```

  ```rust Rust theme={"system"}
  use anyhow::Result;
  use solana_client::nonblocking::rpc_client::RpcClient;
  use solana_sdk::commitment_config::CommitmentConfig;
  use solana_transaction_status_client_types::{TransactionDetails, UiTransactionEncoding};

  #[tokio::main]
  async fn main() -> Result<()> {
      let client = RpcClient::new_with_commitment(
          String::from("https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY"),
          CommitmentConfig::confirmed(),
      );

      let slot_number = 377261141;

      let config = solana_client::rpc_config::RpcBlockConfig {
          encoding: UiTransactionEncoding::Base58.into(),
          transaction_details: TransactionDetails::Full.into(),
          rewards: None,
          commitment: CommitmentConfig::finalized().into(),
          max_supported_transaction_version: Some(0),
      };
      let block = client.get_block_with_config(slot_number, config).await?;

      println!("Block: {:#?}", block);

      Ok(())
  }
  ```
</CodeGroup>

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

* **Slot và chiều cao khối:** Hãy nhớ rằng `getBlock` nhận đầu vào là số `slot`, không nhất thiết là chiều cao khối. Dù các slot có thứ tự liên tiếp, một số slot có thể bị leader bỏ qua. Trường `blockHeight` trong phản hồi cho biết số khối thực tế đứng trước khối này.
* **`maxSupportedTransactionVersion` rất quan trọng:** Để kiểm tra các khối có giao dịch được đánh phiên bản (hiện là tiêu chuẩn và sử dụng Bảng tra cứu địa chỉ), bạn **phải** đặt `maxSupportedTransactionVersion: 1` (hoặc phiên bản cao hơn nếu có tiêu chuẩn mới). Nếu quên, hầu hết các khối hiện đại sẽ trả về lỗi.
* **Chọn `transactionDetails`:**
  * `full` cần thiết cho hầu hết các phân tích chi tiết nhưng trả về nhiều dữ liệu nhất.
  * `signatures` hữu ích nếu bạn chỉ cần liệt kê các giao dịch trong một khối.
  * `accounts` có thể là lựa chọn trung gian nếu bạn cần xem những tài khoản nào có liên quan mà không truy xuất toàn bộ dữ liệu lệnh.
  * `none` hiếm khi được dùng nhưng có thể phù hợp nếu bạn chỉ quan tâm đến siêu dữ liệu cấp khối như `blockhash` hoặc `rewards`.
* **Nên dùng `jsonParsed` để mã hóa:** Khi yêu cầu thông tin chi tiết về giao dịch, `jsonParsed` cung cấp đầu ra thân thiện nhất với nhà phát triển và phân giải chính xác các tài khoản từ Bảng tra cứu địa chỉ, điều mà `json` (không còn được khuyến nghị) không thực hiện được.
* **Khối không khả dụng:** Kết quả `null` có nghĩa là không tìm thấy khối tại slot đó. Nguyên nhân có thể là slot đã bị bỏ qua, khối chưa được xác nhận đến mức do `commitment` chỉ định hoặc nút RPC đã loại bỏ khối lịch sử đó khỏi sổ cái (thường xảy ra với các slot cũ hơn).
* **Thông tin phần thưởng:** Cần đặt `rewards: true` để xem việc phân phối phần thưởng khối cho trình xác thực (và có thể cả người stake, tùy thuộc vào loại phần thưởng). Việc này làm tăng kích thước phản hồi.
* **Tìm hiểu cấu trúc khối:** Để hiểu sâu hơn về cách các khối được tổ chức trong kiến trúc Solana, hãy xem [Tìm hiểu về slot, khối và epoch trên Solana](https://www.helius.dev/blog/solana-slots-blocks-and-epochs).
