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

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

Базовая комиссия

Каждая транзакция стоит 5000 lamports за каждую включённую подпись. Этот сбор оплачивается первым подписантом транзакции. Только аккаунты, принадлежащие System Program, могут оплачивать комиссии за транзакции. Базовая комиссия распределяется следующим образом:

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

Приоритетная комиссия — это необязательная плата, которая используется для увеличения вероятности того, что текущий лидер (валидатор) обработает вашу транзакцию. Валидатор получает 100% приоритетной комиссии. Приоритетные комиссии можно настроить, изменив цену и лимит вычислительных единиц (CU) транзакции. (См. руководство Как использовать приоритетные комиссии для получения дополнительной информации о приоритетных комиссиях.)

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

Prioritization fee formula
Prioritization fee = CU limit * CU price

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

Transaction priority formula
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)

Лимит вычислительных единиц

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

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

  1. Оцените необходимое количество CU, смоделировав транзакцию.
  2. Добавьте 10% к этой оценке в качестве запаса.

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

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

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

Цена CU по умолчанию равна 0, что означает, что приоритетная комиссия по умолчанию также равна 0.

Чтобы определить оптимальную цену CU для вашей транзакции, обратитесь к рекомендациям по цене CU в реальном времени, приведённым в таблице ниже.

ПровайдерAPI приоритетной комиссии
HeliusДокументация
QuickNodeДокументация
TritonДокументация

Пример

Примеры ниже показывают, как установить лимит CU и цену CU для транзакции с использованием SDK Solana.

SDKСсылка на исходный код
@solana/web3.js (Typescript)ComputeBudgetProgram
solana-sdk (Rust)ComputeBudgetInstruction
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?

Содержание

Редактировать страницу