交易费用
每笔 Solana 交易都需要支付基础费用(SOL),以补偿验证者处理交易的成本。您还可以支付可选的优先费用,以增加当前领导者(验证者)处理您交易的机会。
基础交易费用
基础费用是发送交易的成本。每个交易签名的费用为 5000 lamports。
基础费用从交易费用支付者的账户中扣除,该账户是交易中的第一个签名者。费用支付者必须是由 System Program 拥有的账户。
优先费用是一种可选费用,用于增加当前领导者处理您交易的机会。
计算单元和限制
当处理交易时,会使用以计算单元(CU)为单位的计算资源。每条指令都会从交易的计算单元预算中扣除。
SetComputeUnitLimit
指令来请求特定的计算单元限制。
有关计算单元使用的更多详细信息:
计算单元价格
计算单元价格是一个可选金额,以微 lamport 为单位,您为每个请求的计算单元支付的费用。此价格用于计算交易的优先费用。
使用以下资源获取当前计算单元价格的实时建议:
请参阅 如何使用优先费用 指南,了解有关优先费用的更多详细信息。
计算优先费用
的计算公式为:
优先费用 = 计算单元限制 × 计算单元价格
设置优先费用的推荐方法是首先
交易以估算所需的计算单元。然后,在此估算值上增加 10% 的安全余量,并将结果值用作
Compute Unit Limit
。
交易优先级 ,决定了它相对于其他交易的优先顺序,使用以下公式计算:
优先级 = ((计算单元限制 * 计算单元价格) + 基础费用) / (1 + 计算单元限制 + 签名计算单元 + 写锁计算单元)
请按照以下说明为交易设置计算单元限制和价格:
SetComputeUnitLimit
用于设置特定的单元限制。
SetComputeUnitPrice
用于定义每个计算单元的价格。
如果您未提供这些说明,交易将使用默认的计算单元限制,计算单元价格为 0(无优先级费用)。
优先级费用取决于您为交易请求的计算单元限制,而不是实际使用的计算单元。如果您设置的计算单元限制过高或使用默认值,可能会为未使用的计算单元支付费用。
以下示例展示了如何为交易设置计算单元限制和价格。
SDK | 源代码参考 |
---|---|
solana-sdk
(Rust)
|
ComputeBudgetInstruction
|
@solana/web3.js
(Typescript)
|
ComputeBudgetProgram
|
const limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1import {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_SOLawait connection.confirmTransaction(airdropSignature, "confirmed");// Create compute budget instructionsconst limitInstruction = ComputeBudgetProgram.setComputeUnitLimit({units: 300_000const priceInstruction = ComputeBudgetProgram.setComputeUnitPrice({microLamports: 1const 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);