交易费用
每笔 Solana 交易都需要支付基础费用(以 SOL 计)来补偿验证者处理交易的成本。您还可以支付可选的优先费用,以增加当前领导者(验证者)处理您交易的机会。
关键点
- 交易的 基础费用 是每个签名 5000 lamports。
- 优先费用(可选)是您支付给验证者的额外费用,用于增加当前领导者处理您交易的机会。
- 优先费用计算公式为:(计算单元限制 * 计算单元价格)。
- 计算单元限制 是您的交易可以使用的最大计算单元数。
- 计算单元价格 是每个计算单元的价格,以微 lamports 为单位。
- 1,000,000 微 lamports = 1 lamport
- 交易费用支付者必须是由系统程序拥有的账户。
基础交易费用
基础费用是发送交易的成本。每个签名的费用为 5000 lamports。
基础费用从交易费用支付者的账户中扣除,该账户是交易中的第一个签名者。费用支付者必须是由系统程序拥有的账户。
优先费用
优先费用是一种可选费用,用于增加当前领导者处理您交易的机会。
- SIMD-0096:处理交易的 validator 将获得 100% 的优先费用。
计算单元和限制
当处理交易时,会使用以计算单元(CU)为单位的计算资源。每条指令都会从交易的计算单元预算中扣除。
- 最大限制:一笔交易最多可以使用 140 万计算单元。
- 默认限制:默认情况下,每条指令最多可以使用 200,000 计算单元。
- 自定义限制:您可以通过在交易中包含
SetComputeUnitLimit
指令来请求特定的计算单元限制。
有关计算单元使用的更多详细信息:
请参阅 如何请求最佳计算 指南,了解有关计算单元使用的更多详细信息。
计算单元价格
计算单元价格是一个可选金额,以微 lamport 为单位,您为每个请求的计算单元支付的费用。此价格用于计算交易的优先费用。
1,000,000 微 lamport = 1 lamport
使用以下资源获取当前计算单元价格的实时建议:
请参阅 如何使用优先费用 指南,了解有关优先费用的更多详细信息。
计算优先费用
优先费用的计算公式为:
优先费用 = 计算单元限制 × 计算单元价格
使用以下指令在交易中设置计算单元限制和价格:
SetComputeUnitLimit
设置特定的单元限制。SetComputeUnitPrice
定义每个计算单元的价格。
如果您未提供这些指令,交易将使用默认的计算单元限制,计算单元价格为 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 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);
ConsolePowered by Mirror
Click to execute the code.
Is this page helpful?