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

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

Основные моменты

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

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

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

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

Приоритетная комиссия

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

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

Единицы вычислений и лимиты

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

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

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

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

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

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

1,000,000 микро-лампортов = 1 лампорт

Используйте эти ресурсы, чтобы получить рекомендации в реальном времени по текущей цене единицы вычислений:

Провайдер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 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);
Console
Click to execute the code.

Is this page helpful?