Кожна транзакція 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, включіть
інструкцію
SetComputeUnitPrice
у вашу транзакцію.
Стандартна ціна CU дорівнює 0, що означає, що стандартна пріоритетна комісія також дорівнює 0.
Для допомоги у визначенні найкращої ціни CU для вашої транзакції перегляньте рекомендації щодо ціни CU в реальному часі, наведені в таблиці нижче.
| Провайдер | API пріоритетної комісії |
|---|---|
| Helius | Документація |
| QuickNode | Документація |
| Triton | Документація |
Приклад
Приклади нижче показують, як встановити ліміт CU та ціну CU для транзакції використовуючи Solana SDK.
| 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?