交易费用

每笔 Solana 交易都需要支付基础费用(以 SOL 计)来补偿验证者处理交易的成本。您还可以支付可选的优先费用,以增加当前领导者(验证者)处理您交易的机会。

关键点

  • 交易的 基础费用 是每个签名 5000 lamports。
  • 优先费用(可选)是您支付给验证者的额外费用,用于增加当前领导者处理您交易的机会。
  • 优先费用计算公式为:(计算单元限制 * 计算单元价格)
  • 计算单元限制 是您的交易可以使用的最大计算单元数。
  • 计算单元价格 是每个计算单元的价格,以微 lamports 为单位。
  • 1,000,000 微 lamports = 1 lamport
  • 交易费用支付者必须是由系统程序拥有的账户。

基础交易费用

基础费用是发送交易的成本。每个签名的费用为 5000 lamports。

基础费用从交易费用支付者的账户中扣除,该账户是交易中的第一个签名者。费用支付者必须是由系统程序拥有的账户。

  • 50% 销毁:基础费用的一半会被销毁。
  • 50% 分配:另一半支付给处理交易的验证者。

优先费用

优先费用是一种可选费用,用于增加当前领导者处理您交易的机会。

  • SIMD-0096:处理交易的 validator 将获得 100% 的优先费用。

计算单元和限制

当处理交易时,会使用以计算单元(CU)为单位的计算资源。每条指令都会从交易的计算单元预算中扣除。

  • 最大限制:一笔交易最多可以使用 140 万计算单元
  • 默认限制:默认情况下,每条指令最多可以使用 200,000 计算单元
  • 自定义限制:您可以通过在交易中包含 SetComputeUnitLimit 指令来请求特定的计算单元限制。

有关计算单元使用的更多详细信息:

请参阅 如何请求最佳计算 指南,了解有关计算单元使用的更多详细信息。

计算单元价格

计算单元价格是一个可选金额,以微 lamport 为单位,您为每个请求的计算单元支付的费用。此价格用于计算交易的优先费用。

1,000,000 微 lamport = 1 lamport

使用以下资源获取当前计算单元价格的实时建议:

提供商Priority Fee API
Helius文档
Triton文档

请参阅 如何使用优先费用 指南,了解有关优先费用的更多详细信息。

计算优先费用

优先费用的计算公式为:

优先费用 = 计算单元限制 × 计算单元价格

使用以下指令在交易中设置计算单元限制和价格:

如果您未提供这些指令,交易将使用默认的计算单元限制,计算单元价格为 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?

Table of Contents

Edit Page