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

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

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

Каждая транзакция стоит 5000 лампортов за каждую включённую подпись. Эту комиссию оплачивает первый подписант транзакции, и она должна быть оплачена аккаунтом, принадлежащим 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?

Содержание

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