Solana 计算预算怎么调?CU 上限、单价与优先费的关系 图 1
Solana 计算预算怎么调?CU 上限、单价与优先费的关系 · 图 1

结论先说

Solana 的一笔交易贵不贵、挤不挤得进区块,由两个彼此独立的旋钮决定:计算单元上限(CU limit,这笔交易最多允许烧多少计算量)与计算单元价格(CU price,每单位计算量愿付多少微 lamport,即优先费报价)。基础费按签名收取(当前为每个签名 5000 lamports,一半销毁一半给验证者,来源见文末官方文档),优先费则按”报价乘以你自己声明的上限”折算——公式的关键在于它按你声明的上限计费,不按实际用量计费。于是出现一个 Solana 特有的省钱命题:声明上限过高的交易,即使实际用量很低,也在为空转的额度付优先费(优先费概念见Solana优先费是什么?,概念区分见Solana计算单元和优先费区别?)。

计算单元:Solana 的”燃料”

Solana 运行时把每条指令的每一步操作(算术、读账户、调程序)都折算成计算单元 CU。默认预算里,每条非内置指令分得 200000 CU,整笔交易封顶 140 万 CU——这两个数字构成”免费默认档”。交易可以在签名前插入两条预算指令改写默认:SetComputeUnitLimit 把整笔交易的上限钉在你指定的值(会被夹到 140 万以内),SetComputeUnitPrice 声明每 CU 的微 lamport 单价(默认 0)。另两条预算指令限制堆内存与加载账户数据量,思路相同:先声明、后计费、超限即失败。

Solana 计算预算怎么调?CU 上限、单价与优先费的关系机制示意

费用公式拆开看

一笔交易的总费用约等于:基础费(每签名 5000 lamports)加优先费(CU 单价乘 CU 上限,除以百万后取整,lamports 计)。三点工程含义:其一,优先费是”报价×声明额度”的乘积,把上限从 20 万抬到 140 万而单价不变,优先费直接放大七倍——即使程序实际只烧了 20 万 CU;其二,失败交易照样扣费,重试前请检查预算指令;其三,验证者调度看的是每 CU 报价,不是总费用——同样 1000 lamports 的优先费,摊在小上限上的交易比摊在大上限上的更”插队”。想赢过拥堵,抬单价比灌水上限有效。

实操调预算的三条路径

第一条,模拟先行:用 RPC 模拟调用拿到实际 CU 用量,按实际值留一截安全余量设上限——Solana 官方工具链的 computeUnitLimit 模拟就是为这一步提供的,别拿默认 20 万×指令数赌运气。第二条,报价跟随市场:优先费市场波动剧烈,参考近期已确认交易或报价接口的分位数设价,别一口价挂一整周(API 读数方法见Solana优先费是什么?与配套的 getRecentPrioritizationFees 类指南)。第三条,账户声明瘦身:Solana 要求交易事先声明全部账户(地址查找表 ALT 就是为此,见相关专题),少声明无关账户能压缩加载成本与调度限制,间接省 CU。

和以太坊 gas 模型的镜像差异

两套体系恰好互为镜像:以太坊的 gas limit 是全网区块级闸门加交易级消耗计量,费用由基础费市场决定(见区块 gas 上限怎么形成?验证者投票与费用波动的关系);Solana 的 CU 上限则是”你自己声明自己的交易额度”,调度用每 CU 单价竞价。镜像带来的行为差异很实际:以太坊上你几乎不需要关心”声明多少 gas 上限”(声明只影响你愿付的天花板,超出用量部分按实结算);Solana 上声明本身就是成本函数的一部分。从一个生态迁移过来的开发者,最常踩的就是这个”为未用完的 CU 付优先费”的坑。

核验自己动手

文中所有数字(5000 lamports、20 万、140 万、堆与数据上限)都应在 solana.com 官方文档的 constants-reference 与 fee-structure 页面上找到对应条目并核对更新时间;链上侧可以用任意区块浏览器查看最近交易的 CU consumed / CU limit 与优先费拆分,对照自己节点或钱包的估算偏差。参数随版本调整,引用数字请标注抓取时间(本文核验时间 2026 年 7 月 22 日)。

风险提示

交易费与优先费报价随网络拥堵实时波动,本文不构成任何交易成本预测;模拟调用与实际执行存在状态差异,涉及大额的预算指令请先小额验证。本文不构成投资建议。

小结

Solana 费用 = 签名基础费 + CU 单价 × CU 上限。上限决定”允许烧多少、也为额度付钱”,单价决定”排位先后”。先模拟再声明、按分位数报价、少带无关账户——预算指令从玄学变成仪表盘的标志,就是账单上不再出现为闲置算力买单的那一行。