You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在@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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 18:36:51