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

> Tìm hiểu các trường hợp sử dụng getFeeForMessage, 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 [`getFeeForMessage`](https://www.helius.dev/docs/api-reference/rpc/http/getfeeformessage) cho phép bạn ước tính phí mà mạng sẽ tính để xử lý một thông điệp giao dịch nhất định. Phương thức này hữu ích để xác định [chi phí giao dịch](https://www.helius.dev/blog/solana-fees-in-theory-and-practice) trước khi giao dịch được gửi lên mạng.

**Lưu ý về phiên bản:** Phương thức này khả dụng trong `solana-core` v1.9 trở lên. Đối với các phiên bản cũ hơn, hãy cân nhắc sử dụng `getFees`.

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

* **Ước tính phí:** Xác định phí giao dịch dự kiến (tính bằng lamport) cho một thông điệp cụ thể.
* **Tối ưu hóa chi phí:** Phân tích phí cho các cấu trúc giao dịch khác nhau hoặc tại các thời điểm khác nhau.
* **Hiển thị trên giao diện người dùng:** Hiển thị cho người dùng chi phí giao dịch ước tính trước khi họ ký và gửi giao dịch.

## Tham số yêu cầu

1. **`message`** (chuỗi, bắt buộc): Thông điệp giao dịch được mã hóa base64. Bạn có thể lấy thông điệp này bằng cách biên dịch một giao dịch.
2. **`config`** (đối tượng, không bắt buộc): Đối tượng cấu hình có các trường sau:
   * **`commitment`** (chuỗi, không bắt buộc): Chỉ định [mức cam kết](https://www.helius.dev/blog/solana-commitment-levels) cần sử dụng. Giá trị mặc định là `finalized`.
   * **`minContextSlot`** (số, không bắt buộc): Slot tối thiểu mà tại đó yêu cầu có thể được đánh giá.

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

Trường `result` của phản hồi JSON-RPC là một đối tượng có cấu trúc sau:

* **`context`** (đối tượng):
  * **`slot`** (u64): Slot mà tại đó phí được đánh giá.
* **`value`** (u64 | null): Phí ước tính tính bằng lamport. Giá trị này có thể là `null` nếu không thể xác định phí (ví dụ: nếu blockhash được sử dụng trong thông điệp quá cũ hoặc không hợp lệ).

## Ví dụ

### 1. Ước tính phí cho một thông điệp chuyển khoản đơn giản

Ví dụ này minh họa cách tạo một giao dịch chuyển khoản đơn giản, biên dịch thông điệp của giao dịch rồi truy xuất phí ước tính.

<CodeGroup>
  ```bash cURL theme={"system"}
  # First, you need a base64 encoded message. 
  # This typically involves creating a transaction, compiling its message, 
  # and then base64 encoding the serialized message.
  # The example message below is illustrative.
  # Replace "MESSAGE_BASE64_ENCODED" with your actual encoded message.
  curl https://mainnet.helius-rpc.com/?api-key=<api-key> -X POST -H "Content-Type: application/json" -d \
    '{
      "jsonrpc": "2.0",
      "id": 1,
      "method": "getFeeForMessage",
      "params": [
        "MESSAGE_BASE64_ENCODED", // Replace with your actual base64 encoded message
        { "commitment": "processed" }
      ]
    }'
  ```

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

  async function estimateTransactionFee() {
    const connection = new Connection('https://devnet.helius-rpc.com/?api-key=<api-key>');

    try {
      const fromPublicKey = Keypair.generate().publicKey;
      const toPublicKey = Keypair.generate().publicKey;

      let transaction = new Transaction().add(
        SystemProgram.transfer({
          fromPubkey: fromPublicKey,
          toPubkey: toPublicKey,
          lamports: 1000,
        })
      );

      transaction.feePayer = fromPublicKey;
      const { blockhash } = await connection.getLatestBlockhash('confirmed');
      transaction.recentBlockhash = blockhash;

      const message = transaction.compileMessage();
      const messageBase64 = message.serialize().toString('base64');

      console.log(`Compiled Message (Base64): ${messageBase64}`);

      const feeResult = await connection.getFeeForMessage(message, 'confirmed');

      if (feeResult && feeResult.value !== null) {
        console.log(`Estimated Fee: ${feeResult.value} lamports`);
      } else {
        console.log('Could not estimate fee. The value was null.');
        console.log('This might happen if the blockhash is too old or the message is invalid.');
      }

    } catch (error) {
      console.error('Error estimating transaction fee:', error);
      if (error.message.includes('failed to get recent blockhash')) {
          console.error('Ensure your RPC endpoint is responsive or try a different commitment level for getLatestBlockhash.');
      }
    }
  }

  estimateTransactionFee();
  ```
</CodeGroup>

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

* **Tạo thông điệp:** Để sử dụng `getFeeForMessage`, điều quan trọng là phải tạo và tuần tự hóa chính xác `Message` của giao dịch. Quá trình này bao gồm việc thiết lập bên trả phí, các chỉ thị và một blockhash gần đây.
* **Blockhash gần đây:** Thông điệp phải được tạo bằng một blockhash gần đây. Nếu blockhash quá cũ, `value` trong phản hồi có thể là `null`.
* **Phí so với phí ưu tiên:** Phương thức này trả về phí mạng cơ bản. Phí này không bao gồm bất kỳ khoản phí ưu tiên bổ sung nào mà bạn có thể thêm vào giao dịch để tăng khả năng giao dịch được xử lý nhanh trong thời gian mạng bị tắc nghẽn. Sử dụng `getRecentPrioritizationFees` để ước tính [phí ưu tiên](https://www.helius.dev/blog/priority-fees-understanding-solanas-transaction-fee-mechanics).
* **Lamport:** Phí được trả về bằng lamport (1 SOL = 1.000.000.000 lamport).
* **Giá trị null:** Giá trị `null` cho phí có thể cho biết thông điệp có vấn đề (ví dụ: blockhash không hợp lệ, thông điệp sai định dạng) hoặc node không thể tính phí cho thông điệp đó tại mức cam kết hoặc slot đã cho.

Hướng dẫn này cung cấp các bước cần thiết để sử dụng phương thức RPC `getFeeForMessage` nhằm ước tính phí giao dịch trên mạ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 gần đây để tạo thông điệp
  </Card>

  <Card title="getRecentPrioritizationFees" href="/docs/vi/api-reference/rpc/http/getrecentprioritizationfees">
    Ước tính phí ưu tiên để xử lý nhanh hơn
  </Card>
</CardGroup>
