如何在@solana/web3.js的Transaction中指定最高交易手续费
配置Solana交易最高手续费的实现方法
当前交易包含一个手续费字段,用于标识槽位领导者(slot leader)处理交易时被允许收取的最高手续费额度。
@solana/web3.js 中 SystemProgram.transfer() 方法仅负责生成SOL转账的指令片段,本身不包含交易级别的手续费配置能力,你要设置的上述最高手续费额度,需要通过计算预算(Compute Budget)程序指令实现,这是Solana链原生定义的手续费配置规则,没有藏在transfer方法的入参里。
核心逻辑
Solana交易的总手续费由两部分组成,你只要锁死两个核心参数,就能固定整笔交易的最高扣费额度:
- 交易执行最多可消耗的计算单元(CU)上限:超过这个额度交易直接执行失败,不会继续扣费
- 每个计算单元你愿意支付的最高优先费单价:单价乘以实际消耗CU数就是你支付给验证节点的优先费,加上固定的基础签名手续费(当前为每个签名5000 lamports)就是总手续费
两个参数都通过ComputeBudgetProgram提供的方法生成对应指令,追加到交易的指令列表最前面即可生效。
可直接运行的代码示例
import { Connection, Transaction, SystemProgram, ComputeBudgetProgram, sendAndConfirmTransaction, Keypair, PublicKey } from '@solana/web3.js'; // 初始化基础配置 const connection = new Connection("你的Solana RPC节点地址"); const fromKeypair = Keypair.fromSecretKey(/* 付款方钱包私钥 */); const toAddress = new PublicKey("收款方钱包地址"); const transferAmount = 1_000_000; // 转账金额,单位lamport,此处为0.001 SOL // 配置最高手续费参数 // 普通SOL转账实际仅消耗约200~300CU,设置2000足够覆盖冗余 const MAX_ALLOWED_COMPUTE_UNITS = 2000; // 每CU最高支付10000 microLamports优先费,换算下来总优先费最高为 (2000 * 10000) / 1_000_000 = 20000 lamports = 0.00002 SOL // 加5000 lamport基础手续费,整笔交易总手续费不会超过0.000025 SOL,完全锁死最高扣费 const MAX_CU_PRICE_MICRO_LAMPORTS = 10000; // 生成手续费配置指令 const setCuLimitIx = ComputeBudgetProgram.setComputeUnitLimit({ units: MAX_ALLOWED_COMPUTE_UNITS }); const setCuPriceIx = ComputeBudgetProgram.setComputeUnitPrice({ microLamports: MAX_CU_PRICE_MICRO_LAMPORTS }); // 生成转账指令 const transferIx = SystemProgram.transfer({ fromPubkey: fromKeypair.publicKey, toPubkey: toAddress, lamports: transferAmount }); // 组装交易:注意手续费配置指令必须放在指令列表最靠前的位置 const tx = new Transaction().add( setCuLimitIx, setCuPriceIx, transferIx ); // 签名、发送交易 const txSignature = await sendAndConfirmTransaction(connection, tx, [fromKeypair]);
注意事项
- 不要把计算单元上限设得过高:如果不手动设置,节点默认给交易分配200000CU的额度,哪怕你只消耗200CU,优先费也会按你设置的单价乘以200000计算,会产生远超出预期的手续费。
- 不要把计算单元上限设得过低:可以先通过
connection.simulateTransaction()模拟交易拿到实际消耗的CU数,在此基础上留10%~20%的冗余即可,设得低于实际消耗值会导致交易执行失败。 - 你提到的
getEstimatedFee方法仅用于估算当前网络拥堵情况下的推荐手续费,不具备手续费上限配置能力,必须显式添加上述两个计算预算指令才能锁死最高扣费。 - 如果引入
ComputeBudgetProgram报错,将@solana/web3.js升级到1.70及以上版本即可,这是库原生提供的能力,不需要安装第三方依赖。
内容的提问来源于stack exchange,提问作者vietnamese_chowder
相关产品推荐
相关产品推荐

