Комиссии за транзакции
Каждая транзакция в Solana требует уплаты комиссии за транзакцию, которая оплачивается в SOL. Комиссия за транзакцию состоит из двух частей: базовой комиссии и комиссии за приоритет. Базовая комиссия компенсирует валидаторам обработку транзакции. Комиссия за приоритет — это необязательная плата, которая увеличивает вероятность того, что текущий лидер обработает вашу транзакцию.
Базовая комиссия
Каждая транзакция стоит 5000 лампортов за каждую включённую подпись. Эту комиссию оплачивает первый подписант транзакции, и она должна быть оплачена аккаунтом, принадлежащим System Program. Базовая комиссия распределяется следующим образом:
- 50% сжигается: Половина сжигается (удаляется из обращения SOL).
- 50% распределяется: Половина выплачивается валидатору, который обработал транзакцию.
Комиссия за приоритет
Комиссия за приоритет — это необязательная плата, которая используется для увеличения вероятности того, что текущий лидер (валидатор) обработает вашу транзакцию. Валидатор получает 100% комиссии за приоритет. Комиссия за приоритет может быть установлена путём настройки цены и лимита единиц вычислений (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 как чаевые, чтобы
побудить валидатора отдать приоритет вашей транзакции. Чтобы установить цену 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?