Комиссии за транзакции
Каждая транзакция Solana требует базовую комиссию (SOL) для компенсации валидаторам за обработку транзакции. Вы также можете заплатить дополнительную комиссию за приоритет, чтобы увеличить шанс того, что текущий лидер (validator) обработает вашу транзакцию.
Ключевые моменты
- Базовая комиссия за транзакцию составляет 5000 lamport за каждую подпись в транзакции.
- Комиссия за приоритет (опционально) — это дополнительная плата, которую вы платите валидатору чтобы увеличить шанс того, что текущий лидер обработает вашу транзакцию.
- Комиссия за приоритет равна: (лимит вычислительных единиц * цена вычислительной единицы).
- Лимит вычислительных единиц — это максимальное количество вычислительных единиц, которое может использовать ваша транзакция.
- Цена вычислительной единицы — это цена за вычислительную единицу в микро-lamport.
- 1 000 000 микро-lamport = 1 lamport
- Плательщик комиссии за транзакцию должен быть аккаунтом, принадлежащим System Program.
Базовая комиссия за транзакцию
Базовая комиссия — это стоимость отправки транзакции. Стоимость составляет 5000 lamport за каждую подпись, включенную в транзакцию.
Базовая комиссия списывается со счета плательщика комиссии за транзакцию, который является первым подписантом транзакции. Плательщик комиссии должен быть аккаунтом, принадлежащим System Program.
- 50% сжигается: Половина базовой комиссии сжигается.
- 50% распределяется: Половина выплачивается валидатору, который обработал транзакцию.
Комиссия за приоритет
Комиссия за приоритет — это опциональная плата, которая вносится для увеличения шанса того, что текущий лидер обработает вашу транзакцию.
- SIMD-0096: Validator, обрабатывающий транзакцию, получает 100% комиссии за приоритет.
Вычислительные единицы и лимиты
Когда транзакция обрабатывается, она использует вычислительные ресурсы, измеряемые в вычислительных единицах (CU). Каждая инструкция вычитает из бюджета вычислительных единиц транзакции.
- Максимальный лимит: Транзакция может использовать до 1,4 миллиона вычислительных единиц.
- Лимит по умолчанию: По умолчанию каждая инструкция может использовать до 200 000 вычислительных единиц.
- Пользовательский лимит: Вы можете запросить определенный лимит вычислительных
единиц, включив
SetComputeUnitLimit
инструкцию в вашу транзакцию.
Для получения дополнительной информации об использовании вычислительных единиц:
Смотрите руководство Как запросить оптимальные вычислительные ресурсы для получения дополнительной информации об использовании вычислительных единиц.
Цена вычислительной единицы
Цена вычислительной единицы — это необязательная сумма, указанная в микро-lamport, которую вы платите за каждую запрошенную вычислительную единицу. Эта цена используется для расчета комиссии за приоритет вашей транзакции.
Используйте эти ресурсы для получения рекомендаций в реальном времени о текущей цене вычислительной единицы:
Провайдер | API приоритетных комиссий |
---|---|
Helius | Документация |
Triton | Документация |
Смотрите руководство Как использовать комиссии за приоритет для получения дополнительной информации о комиссиях за приоритет.
Расчет комиссии за приоритет
Комиссия за приоритет рассчитывается как:
Комиссия за приоритет = Лимит вычислительных единиц × Цена вычислительной единицы
Используйте эти инструкции для установки лимита и цены вычислительных единиц для транзакции:
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?