Каждая транзакция в Solana требует уплаты комиссии, которая оплачивается в SOL. Комиссия за транзакцию состоит из двух частей: базовой и приоритетной. Базовая комиссия вознаграждает валидаторов за обработку транзакции. Приоритетная комиссия — это необязательный платеж, который увеличивает вероятность того, что текущий лидер обработает вашу транзакцию.
Базовая комиссия
Каждая транзакция стоит 5000 лампортов за каждую включённую подпись. Эту комиссию оплачивает первый подписант транзакции. Только аккаунты, принадлежащие System Program, могут оплачивать комиссии за транзакции. Базовая комиссия распределяется следующим образом:
- 50% сжигается: Половина комиссии сжигается (выводится из обращения SOL).
- 50% распределяется: Половина выплачивается валидатору, который обработал транзакцию.
Приоритетная комиссия
Приоритетная комиссия — это необязательный платеж, который увеличивает вероятность того, что текущий лидер (валидатор) обработает вашу транзакцию. Валидатор получает 100% приоритетной комиссии. Приоритетную комиссию можно установить, изменяя цену вычислительной единицы (CU) и лимит CU в транзакции. (Подробнее о приоритетных комиссиях см. в руководстве по использованию приоритетных комиссий.)
Приоритетная комиссия рассчитывается следующим образом:
Prioritization fee = CU limit * CU price
Приоритетная комиссия используется для определения приоритета вашей транзакции относительно других транзакций. Она рассчитывается по следующей формуле:
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
Лимит вычислительных единиц
По
умолчанию
каждой инструкции выделяется
200 000 CU,
а каждой транзакции —
1,4 миллиона CU.
Вы можете изменить эти значения, добавив инструкцию
SetComputeUnitLimit
в вашу транзакцию.
Чтобы рассчитать подходящий лимит CU для вашей транзакции, рекомендуем выполнить следующие шаги:
- Оцените необходимое количество CU, смоделировав транзакцию
- Добавьте к этой оценке 10% запаса на случай непредвиденных расходов
Приоритетная комиссия определяется по запрошенному лимиту вычислительных единиц (CU) в транзакции, а не по фактическому количеству использованных единиц. Если вы установите слишком высокий лимит или оставите значение по умолчанию, вы можете заплатить за неиспользованные вычислительные единицы.
Цена вычислительной единицы (CU)
Цена вычислительной единицы — это необязательная сумма в
микролампортах, которую вы
платите за каждую запрошенную CU. Можно рассматривать цену CU как чаевые, чтобы
мотивировать validator обработать вашу транзакцию в приоритетном порядке. Чтобы
задать цену CU, добавьте инструкцию
SetComputeUnitPrice
в вашу транзакцию.
Цена CU по умолчанию — 0, то есть комиссия за приоритет по умолчанию также равна 0.
Чтобы определить оптимальную цену CU для вашей транзакции, воспользуйтесь актуальной рекомендацией по цене CU, приведённой в таблице ниже.
| Провайдер | API приоритетных комиссий |
|---|---|
| Helius | Документация |
| QuickNode | Документация |
| Triton | Документация |
Пример
Примеры ниже показывают, как задать лимит CU и цену CU для транзакции с помощью SDK Solana.
| SDK | Ссылка на исходный код |
|---|---|
@solana/web3.js (Typescript) | ComputeBudgetProgram |
solana-sdk (Rust) | ComputeBudgetInstruction |
const limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});
import {LAMPORTS_PER_SOL,SystemProgram,Transaction,Keypair,Connection,ComputeBudgetProgram,sendAndConfirmTransaction} from "@solana/web3.js";const connection = new Connection("http://localhost:8899", "confirmed");const sender = Keypair.generate();const recipient = new Keypair();const airdropSignature = await connection.requestAirdrop(sender.publicKey,LAMPORTS_PER_SOL);await connection.confirmTransaction(airdropSignature, "confirmed");// Create compute budget instructionsconst limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000});const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1});const transferInstruction = SystemProgram.transfer({fromPubkey: sender.publicKey,toPubkey: recipient.publicKey,lamports: 0.01 * LAMPORTS_PER_SOL});// Add the compute budget and transfer instructions to a new transactionconst transaction = new Transaction().add(limitInstruction).add(priceInstruction).add(transferInstruction);const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);console.log("Transaction Signature:", signature);
Is this page helpful?