使用计算单元(CU)和优先费优化交易落地

Last updated September 21, 2026

总结

Umi V1 交易通过模拟来估算计算消耗,并将计算上限和优先费总额存储在 TransactionV1Config 中。

  • 使用 1,400,000 的计算单元上限进行模拟。
  • 为消耗的计算单元增加安全余量。
  • 估算每个计算单元的市场价格,单位为 micro-lamport。
  • 在调用 setTransactionConfig() 前,将估算结果转换为以 lamport 计的费用总额。

在 Solana 上发送交易时,优化两个关键参数可以显著提高交易成功率和成本效益。

快速开始

在发送交易前,估算 V1 的计算单元上限和优先费总额。

  1. 根据交易可写账户近期支付的费用估算优先费。
  2. 使用 V1 的最大计算单元上限模拟交易。
  3. 使用 setTransactionConfig() 应用估算值。
  4. 运行完整的 SOL 转账示例。

优先费

优先费让您可以在本地费用市场中出价,使交易更快被纳入区块。当网络拥堵且多个交易竞争修改相同账户时,验证者会优先处理优先费更高的交易。

优先费的要点:

  • 计算公式为:compute_unit_limit * compute_unit_price
  • 更高的费用会提高交易更快被纳入区块的可能性
  • 应根据当前网络竞争情况,仅支付必要的费用

计算单元上限

计算单元(CU)表示交易所需的计算资源。虽然交易默认会请求大量 CU 作为安全措施,但这通常效率不高:

  1. 无论实际使用量如何,都要为所有请求的 CU 支付优先费
  2. 区块的 CU 容量有限,请求过多 CU 会减少每个区块能够容纳的交易总数

优化 CU 上限的好处:

  • 仅为所需的 CU 付费,从而降低交易成本
  • 让每个区块容纳更多交易,从而提高网络效率
  • 同时确保有足够的资源执行交易

例如,简单的代币转账可能只需要 20,000 CU,而 NFT 铸造可能需要 100,000 CU。适当设置这些上限有助于同时优化成本和整体网络吞吐量。

实现指南

本指南演示如何通过编程方式计算最佳值,而不是依靠猜测。

代码示例使用 fetch 进行 RPC 调用,因为 Umi 尚未实现这些方法。添加官方支持后,请优先使用 Umi 的内置方法。

计算优先费

使用优先费时,必须考虑竞争情况才能取得最佳效果。手动设置一个很大的数值可能导致支付远超所需的费用,而数值过低则可能在竞争激烈时导致交易无法被纳入区块。

要获取交易所涉及账户近期支付的优先费,可以使用 getRecentPrioritizationFees RPC 调用。我们根据返回结果中最高的 100 笔费用计算平均值。您可以根据实际经验调整这一数值。

需要执行以下步骤:

  1. 从交易中提取可写账户
  2. 查询这些账户近期支付的费用
  3. 根据市场情况计算最佳费用

页面底部提供了一个使用此方法执行 SOL 转账的完整示例。

计算计算单元

为了优化交易成本并确保可靠执行,可以先模拟交易,再计算理想的计算单元上限。这种方法比使用固定值更精确,并有助于避免过度分配资源。

模拟过程如下:

  1. 使用最大计算单元数(1,400,000)构建交易
  2. 模拟交易以测量实际消耗的计算单元
  3. 增加 10% 的安全余量以应对波动
  4. 如果模拟失败,则回退到保守的默认值

SOL 转账完整示例

结合上述代码,并添加一些用于创建 Umi 实例的样板代码,可以得到以下创建 SOL 转账交易的脚本:

注意事项

  • 本指南适用于 Umi 1.6.0 或更高版本以及 V1 交易。
  • TransactionV1Config.priorityFee 是以 lamport 计的总金额,而 getRecentPrioritizationFees 返回的是每个计算单元以 micro-lamport 计的价格。
  • V1 交易不支持 Address Lookup Tables 或 Compute Budget 指令。
  • 将现有 V0 交易构建器转换为 V1 时,请参阅从 V0 迁移到 V1 交易。