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

# Как использовать getFeeForMessage

> Узнайте о сценариях использования getFeeForMessage, примерах кода, параметрах запроса, структуре ответа и рекомендациях.

Метод RPC [`getFeeForMessage`](https://www.helius.dev/docs/api-reference/rpc/http/getfeeformessage) позволяет оценить комиссию, которую сеть взимает за обработку указанного сообщения транзакции. Это помогает определить [стоимость транзакции](https://www.helius.dev/blog/solana-fees-in-theory-and-practice) до ее отправки в сеть.

**Примечание о версии:** этот метод доступен в `solana-core` версии 1.9 и новее. Для более ранних версий используйте `getFees`.

## Распространенные сценарии использования

* **Оценка комиссии:** определите предполагаемую комиссию за транзакцию (в лампортах) для конкретного сообщения.
* **Оптимизация затрат:** проанализируйте комиссии для разных структур транзакций или в разное время.
* **Отображение в пользовательском интерфейсе:** покажите пользователям предполагаемую стоимость транзакции до ее подписания и отправки.

## Параметры запроса

1. **`message`** (строка, обязательный): сообщение транзакции в кодировке base64. Его можно получить путем компиляции транзакции.
2. **`config`** (объект, необязательный): объект конфигурации со следующими полями:
   * **`commitment`** (строка, необязательный): задает используемый [уровень подтверждения](https://www.helius.dev/blog/solana-commitment-levels). Значение по умолчанию — `finalized`.
   * **`minContextSlot`** (число, необязательный): минимальный слот, на котором можно обработать запрос.

## Структура ответа

Поле `result` ответа JSON-RPC представляет собой объект со следующей структурой:

* **`context`** (объект):
  * **`slot`** (u64): слот, на котором была рассчитана комиссия.
* **`value`** (u64 | null): предполагаемая комиссия в лампортах. Значением может быть `null`, если комиссию невозможно определить (например, если хеш блока, используемый в сообщении, устарел или недействителен).

## Примеры

### 1. Оценка комиссии для сообщения о простом переводе

В этом примере показано, как создать простой перевод, скомпилировать его сообщение и получить предполагаемую комиссию.

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

## Рекомендации для разработчиков

* **Создание сообщения:** чтобы использовать `getFeeForMessage`, необходимо правильно создать и сериализовать `Message` транзакции. Для этого нужно задать плательщика комиссии, инструкции и недавний хеш блока.
* **Недавний хеш блока:** сообщение должно быть создано с недавним хешем блока. Если хеш блока слишком старый, значением `value` в ответе может быть `null`.
* **Базовая и приоритетная комиссии:** этот метод возвращает базовую сетевую комиссию. В нее не входят дополнительные приоритетные комиссии, которые можно добавить к транзакции, чтобы повысить вероятность ее быстрой обработки при высокой нагрузке на сеть. Используйте `getRecentPrioritizationFees` для оценки [приоритетных комиссий](https://www.helius.dev/blog/priority-fees-understanding-solanas-transaction-fee-mechanics).
* **Лампорты:** комиссия возвращается в лампортах (1 SOL = 1 000 000 000 лампортов).
* **Значение null:** значение `null` для комиссии может указывать на проблемы с сообщением (например, недействительный хеш блока или некорректное сообщение) либо на то, что узел не может рассчитать для него комиссию при заданном уровне подтверждения или слоте.

В этом руководстве описаны необходимые шаги для использования метода RPC `getFeeForMessage` с целью оценки комиссий за транзакции в сети Solana.

## Связанные методы

<CardGroup cols={2}>
  <Card title="getLatestBlockhash" href="/docs/ru/api-reference/rpc/http/getlatestblockhash">
    Получите недавний хеш блока для создания сообщений
  </Card>

  <Card title="getRecentPrioritizationFees" href="/docs/ru/api-reference/rpc/http/getrecentprioritizationfees">
    Оцените приоритетные комиссии для ускорения обработки
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.