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

Каждая транзакция 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Документация
QuickNodeДокументация
TritonДокументация

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

Расчет комиссии за приоритет

Комиссия за приоритет рассчитывается следующим образом:

Комиссия за приоритет = Лимит вычислительных единиц × Цена вычислительной единицы

Рекомендуемый подход для установки комиссии за приоритет — сначала симулировать транзакцию, чтобы оценить требуемое количество вычислительных единиц. Затем добавьте 10% к этой оценке в качестве запаса и используйте полученное значение как Compute Unit Limit.

Приоритет транзакции, который определяет её очередность относительно других транзакций, рассчитывается по следующей формуле:

Приоритет = ((Лимит вычислительных единиц * Цена за вычислительную единицу) + Базовая комиссия) / (1 + Лимит вычислительных единиц + Подписи CU + Блокировки записи CU)

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

  • 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?