Комиссии за транзакции

Каждая транзакция Solana требует базовую комиссию (SOL) для компенсации валидаторам за обработку транзакции. Вы также можете заплатить дополнительную комиссию за приоритет, чтобы увеличить шанс того, что текущий лидер (validator) обработает вашу транзакцию.

Ключевые моменты

  • Базовая комиссия за транзакцию составляет 5000 lamport за каждую подпись в транзакции.
  • Комиссия за приоритет (опционально) — это дополнительная плата, которую вы платите валидатору чтобы увеличить шанс того, что текущий лидер обработает вашу транзакцию.
  • Комиссия за приоритет равна: (лимит вычислительных единиц * цена вычислительной единицы).
  • Лимит вычислительных единиц — это максимальное количество вычислительных единиц, которое может использовать ваша транзакция.
  • Цена вычислительной единицы — это цена за вычислительную единицу в микро-lamport.
  • 1 000 000 микро-lamport = 1 lamport
  • Плательщик комиссии за транзакцию должен быть аккаунтом, принадлежащим System Program.

Базовая комиссия за транзакцию

Базовая комиссия — это стоимость отправки транзакции. Стоимость составляет 5000 lamport за каждую подпись, включенную в транзакцию.

Базовая комиссия списывается со счета плательщика комиссии за транзакцию, который является первым подписантом транзакции. Плательщик комиссии должен быть аккаунтом, принадлежащим System Program.

Комиссия за приоритет

Комиссия за приоритет — это опциональная плата, которая вносится для увеличения шанса того, что текущий лидер обработает вашу транзакцию.

  • SIMD-0096: Validator, обрабатывающий транзакцию, получает 100% комиссии за приоритет.

Вычислительные единицы и лимиты

Когда транзакция обрабатывается, она использует вычислительные ресурсы, измеряемые в вычислительных единицах (CU). Каждая инструкция вычитает из бюджета вычислительных единиц транзакции.

  • Максимальный лимит: Транзакция может использовать до 1,4 миллиона вычислительных единиц.
  • Лимит по умолчанию: По умолчанию каждая инструкция может использовать до 200 000 вычислительных единиц.
  • Пользовательский лимит: Вы можете запросить определенный лимит вычислительных единиц, включив SetComputeUnitLimit инструкцию в вашу транзакцию.

Для получения дополнительной информации об использовании вычислительных единиц:

Смотрите руководство Как запросить оптимальные вычислительные ресурсы для получения дополнительной информации об использовании вычислительных единиц.

Цена вычислительной единицы

Цена вычислительной единицы — это необязательная сумма, указанная в микро-lamport, которую вы платите за каждую запрошенную вычислительную единицу. Эта цена используется для расчета комиссии за приоритет вашей транзакции.

1 000 000 микро-lamport = 1 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 instructions
const 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 transaction
const transaction = new Transaction()
.add(limitInstruction)
.add(priceInstruction)
.add(transferInstruction);
const signature = await sendAndConfirmTransaction(connection, transaction, [
sender
]);
console.log("Transaction Signature:", signature);
Click to execute the code.

Is this page helpful?