如何估算Anchor编写的Solana自定义程序交易Gas成本
Solana自定义程序交易Gas费估算方法
你用的program.methods.xxx().rpc()是Anchor SDK的标准合约调用写法,不需要实际发起链上交易,通过SDK内置的交易构建、模拟方法就能完成手续费估算,逻辑和你之前估算SPL常规交易的方式完全兼容。
具体实现步骤如下:
- 不要直接调用会触发链上交易提交的
.rpc()方法,先调用.transaction()方法生成未签名、未发送的交易实例,这个过程不会产生任何链上交互。 - 给生成的交易实例补全
recentBlockhash和feePayer配置,和你处理普通交易的配置逻辑一致。 - 调用你之前用的
getEstimatedFee方法就能拿到基础Gas费估算值。
对应代码示例:
// 构建自定义方法对应的交易对象,不会上链 const transaction = await program.methods .myCustomMethod(/* 填入你的自定义方法入参 */) .accounts(/* 填入你的交易关联账户配置 */) .transaction(); // 补全交易必要配置 const latestBlockhash = await connection.getLatestBlockhash(); transaction.recentBlockhash = latestBlockhash.blockhash; transaction.feePayer = wallet.publicKey; // 执行费用估算 const estimatedBaseGas = await transaction.getEstimatedFee(connection);
如果需要更贴近实际执行的精准估算值,可以用.simulate()方法做链下模拟,模拟过程不会真的修改链上状态,返回结果会带交易实际消耗的计算单元数量,你可以结合当前网络的优先费费率算出包含优先费在内的总交易成本:
const simulateRes = await program.methods .myCustomMethod(/* 入参 */) .accounts(/* 账户配置 */) .simulate(); // 实际消耗的计算单元数 const consumedComputeUnits = simulateRes.unitsConsumed; // 结合你要设置的单计算单元优先费,就能算出总费用 = 基础费 + (consumedComputeUnits * 单CU优先费)
注意事项:
.transaction()和.simulate()方法都不会将交易提交到链上,完全满足你不实际发起交易的估算要求。- 上述
getEstimatedFee返回的是网络基础手续费,如果交易需要配置优先费提升上链优先级,需要额外加上你设置的优先费额度,才是最终的交易总成本。
内容的提问来源于stack exchange,提问作者Milkncookiez
相关产品推荐
相关产品推荐

