使用计算单元(CU)和优先费优化交易落地
Last updated September 21, 2026
总结
Umi V1 交易通过模拟来估算计算消耗,并将计算上限和优先费总额存储在 TransactionV1Config 中。
- 使用 1,400,000 的计算单元上限进行模拟。
- 为消耗的计算单元增加安全余量。
- 估算每个计算单元的市场价格,单位为 micro-lamport。
- 在调用
setTransactionConfig()前,将估算结果转换为以 lamport 计的费用总额。
在 Solana 上发送交易时,优化两个关键参数可以显著提高交易成功率和成本效益。
快速开始
在发送交易前,估算 V1 的计算单元上限和优先费总额。
- 根据交易可写账户近期支付的费用估算优先费。
- 使用 V1 的最大计算单元上限模拟交易。
- 使用
setTransactionConfig()应用估算值。 - 运行完整的 SOL 转账示例。
优先费
优先费让您可以在本地费用市场中出价,使交易更快被纳入区块。当网络拥堵且多个交易竞争修改相同账户时,验证者会优先处理优先费更高的交易。
优先费的要点:
- 计算公式为:
compute_unit_limit * compute_unit_price - 更高的费用会提高交易更快被纳入区块的可能性
- 应根据当前网络竞争情况,仅支付必要的费用
计算单元上限
计算单元(CU)表示交易所需的计算资源。虽然交易默认会请求大量 CU 作为安全措施,但这通常效率不高:
- 无论实际使用量如何,都要为所有请求的 CU 支付优先费
- 区块的 CU 容量有限,请求过多 CU 会减少每个区块能够容纳的交易总数
优化 CU 上限的好处:
- 仅为所需的 CU 付费,从而降低交易成本
- 让每个区块容纳更多交易,从而提高网络效率
- 同时确保有足够的资源执行交易
例如,简单的代币转账可能只需要 20,000 CU,而 NFT 铸造可能需要 100,000 CU。适当设置这些上限有助于同时优化成本和整体网络吞吐量。
实现指南
本指南演示如何通过编程方式计算最佳值,而不是依靠猜测。
代码示例使用 fetch 进行 RPC 调用,因为 Umi 尚未实现这些方法。添加官方支持后,请优先使用 Umi 的内置方法。
计算优先费
使用优先费时,必须考虑竞争情况才能取得最佳效果。手动设置一个很大的数值可能导致支付远超所需的费用,而数值过低则可能在竞争激烈时导致交易无法被纳入区块。
要获取交易所涉及账户近期支付的优先费,可以使用 getRecentPrioritizationFees RPC 调用。我们根据返回结果中最高的 100 笔费用计算平均值。您可以根据实际经验调整这一数值。
需要执行以下步骤:
- 从交易中提取可写账户
- 查询这些账户近期支付的费用
- 根据市场情况计算最佳费用
页面底部提供了一个使用此方法执行 SOL 转账的完整示例。
计算计算单元
为了优化交易成本并确保可靠执行,可以先模拟交易,再计算理想的计算单元上限。这种方法比使用固定值更精确,并有助于避免过度分配资源。
模拟过程如下:
- 使用最大计算单元数(1,400,000)构建交易
- 模拟交易以测量实际消耗的计算单元
- 增加 10% 的安全余量以应对波动
- 如果模拟失败,则回退到保守的默认值
SOL 转账完整示例
结合上述代码,并添加一些用于创建 Umi 实例的样板代码,可以得到以下创建 SOL 转账交易的脚本:
注意事项
- 本指南适用于 Umi 1.6.0 或更高版本以及 V1 交易。
TransactionV1Config.priorityFee是以 lamport 计的总金额,而getRecentPrioritizationFees返回的是每个计算单元以 micro-lamport 计的价格。- V1 交易不支持 Address Lookup Tables 或 Compute Budget 指令。
- 将现有 V0 交易构建器转换为 V1 时,请参阅从 V0 迁移到 V1 交易。
