Комиссии за транзакции
Каждая транзакция в Solana требует уплаты комиссии за транзакцию, которая оплачивается в SOL. Комиссии за транзакции делятся на две части: базовая комиссия и приоритетная комиссия. Базовая комиссия компенсирует валидаторам обработку транзакции. Приоритетная комиссия — это необязательная плата, которая увеличивает вероятность того, что текущий лидер обработает вашу транзакцию.
Базовая комиссия
Каждая транзакция стоит 5000 lamports за каждую включённую подпись. Этот сбор оплачивается первым подписантом транзакции. Только аккаунты, принадлежащие System Program, могут оплачивать комиссии за транзакции. Базовая комиссия распределяется следующим образом:
- 50% сжигается: Половина сжигается (удаляется из циркулирующего запаса SOL).
- 50% распределяется: Половина выплачивается валидатору, который обработал транзакцию.
Приоритетная комиссия
Приоритетная комиссия — это необязательная плата, которая используется для увеличения вероятности того, что текущий лидер (валидатор) обработает вашу транзакцию. Валидатор получает 100% приоритетной комиссии. Приоритетные комиссии можно настроить, изменив цену и лимит вычислительных единиц (CU) транзакции. (См. руководство Как использовать приоритетные комиссии для получения дополнительной информации о приоритетных комиссиях.)
Приоритетная комиссия рассчитывается следующим образом:
Prioritization fee formula
Prioritization fee = CU limit * CU price
Приоритетная комиссия используется для определения приоритета транзакции относительно других транзакций. Она рассчитывается по следующей формуле:
Transaction priority formula
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 как чаевые, чтобы
побудить валидатор отдать приоритет вашей транзакции. Чтобы установить цену 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);
Console
Click to execute the code.
Is this page helpful?