每笔 Solana 交易都需要支付交易手续费,费用以 SOL 结算。交易手续费分为两部分:基础费用和优先费用。基础费用用于补偿 validator 处理交易。优先费用是可选的,用于提高当前 leader 处理你交易的概率。
基础费用
每笔交易每包含一个签名需支付 5000 lamports。该费用由交易的第一个签名者支付。只有 System Program 拥有的账户可以支付交易手续费。基础费用分配如下:
- 50% 销毁: 一半会被销毁(从 SOL 流通总量中移除)。
- 50% 分配: 另一半支付给处理该交易的 validator。
优先费用
优先费用是一种可选费用,用于提高当前 leader(validator)处理你交易的概率。validator 会获得100% 的优先费用。你可以通过调整交易的计算单元(CU)价格和 CU 限额来设置优先费用。(详见优先费用使用指南获取更多信息。)
优先费用的计算方式如下:
Prioritization fee = CU limit * CU price
优先费用用于确定你的交易优先级,相对于其他交易。其计算公式如下:
Priority = (Prioritization fee + Base fee) / (1 + CU limit + Signature CUs + Write lock CUs)
计算单元限额
默认情况下,每条指令分配
200,000 CU,每笔交易分配
140 万 CU。你可以在交易中包含一个
SetComputeUnitLimit
指令来更改这些默认值。
要为您的交易计算合适的 CU 限额,建议按照以下步骤操作:
- 通过模拟交易,估算所需的 CU 单位数
- 在估算值基础上增加 10% 的安全余量
优先费是由请求的计算单元(CU)限额决定的,而不是实际使用的计算单元数量。如果您设置的 CU 限额过高或使用默认值,可能会为未使用的计算单元付费。
计算单元价格
计算单元价格是为每个请求的 CU 支付的可选
micro-lamports
数量。您可以将 CU 价格视为一种小费,用于激励 validator 优先处理您的交易。要设置 CU 价格,请在交易中包含一个
SetComputeUnitPrice
指令。
如需帮助确定适合您交易的 CU 价格,请参阅下表中提供的实时 CU 价格建议。
| Provider | Priority Fee API |
|---|---|
| Helius | Documentation |
| QuickNode | Documentation |
| Triton | Documentation |
示例
以下示例展示了如何使用 Solana SDK 在交易中设置 CU 限额和 CU 价格。
| 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 instructionsconst 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 transactionconst transaction = new Transaction().add(limitInstruction).add(priceInstruction).add(transferInstruction);const signature = await sendAndConfirmTransaction(connection, transaction, [sender]);console.log("Transaction Signature:", signature);
Is this page helpful?