Комиссии за транзакции
Каждая транзакция в Solana требует базовой комиссии (SOL) для компенсации валидаторам за обработку транзакции. Вы также можете заплатить дополнительную приоритетную комиссию, чтобы увеличить вероятность того, что текущий лидер (валидатор) обработает вашу транзакцию.
Основные моменты
- Базовая комиссия за транзакцию составляет 5000 лампортов за каждую подпись в транзакции.
- Приоритетная комиссия (опционально) — это дополнительная плата валидатору, чтобы увеличить вероятность того, что текущий лидер обработает вашу транзакцию.
- Приоритетная комиссия рассчитывается по формуле: (лимит вычислительных единиц * цена вычислительной единицы).
- Лимит вычислительных единиц — это максимальное количество вычислительных единиц, которые может использовать ваша транзакция.
- Цена вычислительной единицы — это стоимость одной вычислительной единицы в микролампортах.
- 1 000 000 микролампортов = 1 лампорт.
- Плательщиком комиссии за транзакцию должен быть аккаунт, принадлежащий System Program.
Базовая комиссия за транзакцию
Базовая комиссия — это стоимость отправки транзакции. Она составляет 5000 лампортов за каждую подпись, включенную в транзакцию.
Базовая комиссия списывается с аккаунта плательщика комиссии за транзакцию, который является первым подписантом в транзакции. Плательщик комиссии должен быть аккаунтом, принадлежащим System Program.
- 50% сжигается: половина базовой комиссии сжигается.
- 50% распределяется: половина выплачивается валидатору, который обработал транзакцию.
Приоритетная комиссия
Приоритетная комиссия — это опциональная плата, которая увеличивает вероятность того, что текущий лидер обработает вашу транзакцию.
- SIMD-0096: Валидатор, обрабатывающий транзакцию, получает 100% приоритетной комиссии.
Единицы вычислений и лимиты
При обработке транзакции используются вычислительные ресурсы, измеряемые в единицах вычислений (CU). Каждая инструкция уменьшает бюджет единиц вычислений транзакции.
- Максимальный лимит: Транзакция может использовать до 1,4 миллиона единиц вычислений.
- Лимит по умолчанию: По умолчанию каждая инструкция может использовать до 200,000 единиц вычислений.
- Пользовательский лимит: Вы можете запросить определённый лимит единиц
вычислений, включив
SetComputeUnitLimit
инструкцию в вашу транзакцию.
Для получения дополнительной информации об использовании единиц вычислений:
См. руководство Как запросить оптимальные вычисления для получения дополнительной информации об использовании единиц вычислений.
Цена единицы вычислений
Цена единицы вычислений — это необязательная сумма, указанная в микро-лампортах, которую вы платите за каждую запрошенную единицу вычислений. Эта цена используется для расчёта приоритетной комиссии за вашу транзакцию.
Используйте эти ресурсы, чтобы получить рекомендации в реальном времени по текущей цене единицы вычислений:
Провайдер | API приоритетной комиссии |
---|---|
Helius | Документация |
QuickNode | Документация |
Triton | Документация |
См. руководство Как использовать приоритетные комиссии для получения дополнительной информации о приоритетных комиссиях.
Расчёт приоритетной комиссии
Приоритетная комиссия рассчитывается следующим образом:
Приоритетная комиссия = Лимит единиц вычислений × Цена единицы вычислений
Рекомендуемый подход к установке приоритетных комиссий — сначала
симулировать
транзакцию, чтобы оценить требуемое количество единиц вычислений. Затем добавьте
10%-ный запас к этой оценке и используйте полученное значение как
Compute Unit Limit
.
Приоритет транзакции, который определяет её очередность относительно других транзакций, рассчитывается по следующей формуле:
Приоритет = ((Лимит вычислительных единиц * Цена вычислительной единицы) + Базовая комиссия) / (1 + Лимит вычислительных единиц + Подпись CUs + Блокировка записи CUs)
Используйте эти инструкции, чтобы установить лимит и цену вычислительных единиц для транзакции:
SetComputeUnitLimit
для установки конкретного лимита единиц.SetComputeUnitPrice
для определения цены за вычислительную единицу.
Если вы не предоставите эти инструкции, транзакция будет использовать лимит вычислительных единиц по умолчанию с ценой вычислительной единицы 0 (без комиссии за приоритет).
Комиссия за приоритет зависит от лимита вычислительных единиц, который вы запрашиваете для транзакции, а не от фактически использованных единиц. Если вы установите слишком высокий лимит или используете значение по умолчанию, вы можете заплатить за неиспользованные вычислительные единицы.
Примеры
Следующие примеры показывают, как установить лимит и цену вычислительных единиц для транзакции.
SDK | Ссылка на исходный код |
---|---|
solana-sdk (Rust) | ComputeBudgetInstruction |
@solana/web3.js (Typescript) | ComputeBudgetProgram |
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?