一次 Starknet 交易要结三种 gas:二层价、一层价与数据价的算账顺序 图 1
一次 Starknet 交易要结三种 gas:二层价、一层价与数据价的算账顺序 · 图 1

一份账单为什么会有三种计价单位

Starknet 的交易费用不是单一数字。官方文档把它拆成三块成本:L2 计算、L2 数据(包含 calldata、事件与代码)和 L1 数据。前两块在二层内部计量,第三块又分两种来源——把这笔交易引起的状态差异发布到以太坊的成本,以及它发出的 L2 到 L1 消息最终要作为 calldata 进 Starknet 核心合约的成本。对应地,文档定义了三套单位:衡量二层资源的 L2 gas、衡量发布状态差异所需 L1 数据的 L1 data gas,以及衡量发送 L2 到 L1 消息所需 L1 gas 的 L1 gas。

要特别说明时间边界:文档写明本文描述的是从 Starknet v0.13.0 开始在二层支付的费用;L1 到 L2 消息的费用是另一套在 L1 支付的口径,不在这条公式里。读旧的费率讨论时,先确认它讲的是哪一版。

三种价格各自怎么定

三条不同高度与色调的光带,示意二层价、一层价与数据价三种独立计价单位(图片由 Agnes 生成,非产品界面或链上数据图)

每个 Starknet 块会关联三个整数价格:l1_gas_price、l2_gas_price 和 l1_data_gas_price。

前两者跟着一层的行情走,但不是实时抓取。文档记载的口径是:取排序器每 60 秒采样一次的最近 60 个 L1 基础 gas 价(或数据 gas 价)的平均值,再加 1 Gwei。至于 L1 数据那一档,这个数还要再乘一个 0.135 的缩放系数,用来近似数据发布到以太坊时平均获得的压缩率。也就是说,二层账单里的“一层价”是一段滑动平均,不是你现在去看 gas trackers 读到的那个瞬时值。

二层自己的价格用类似 EIP-1559 的方式调节:用上一个块的 L2 gas 总用量减去目标值,除以目标值,乘一个系数 C(文档给的值为四十八分之一),得到的比例去缩放上一块的二层价格,并且不低于最低价。目标值被定义为区块容量的 80%,最低价当前是 3 gFri,即 3 乘十的负九次方 STRK,并且文档注明它会随交易处理成本的变化而调整。由此可推出三条性质:上一块用量正好等于目标则价格不动;高于目标则涨、低于则跌;由于目标高过半个区块容量,空闲时的降价速度比拥堵时的涨价速度更快;网络完全不拥挤时二层价格就等于最低价。

从 v0.14.0 起必须交的三组上限

文档记下一个明确的版本分界:从 v0.14.0 起,所有交易都要为三种计价单位分别给出以 STRK 计的两个数——max_amount 与 max_price_per_unit。一笔交易能进块的必要条件是:它的 max_price_per_unit 在每个资源维度上都不低于该块的对应价格。而一旦交易被纳入,实际收取的价格由 Starknet OS 强制不超过交易自己声明的最高价,这份强制本身受证明约束。文档同时说明,v3 交易已经通过 resource_bounds 字典提供了这些界限。

这套设计的方向值得读准:它不是保证你按最低价成交,而是给你一道天花板——块价涨得再凶,你的单子不会超过自己写的单位价;代价是当块价高于你的上限时,这笔交易根本进不了块。

钱是怎么扣走的

计费不是事后补账。文档描述,费用与交易执行在二层原子扣除:由 Starknet OS 注入一笔 STRK 转账,金额等于应付费用,付款人是提交这笔交易的一方,收款人是排序器。换句话说,扣费本身就是被执行证明覆盖的一步,排序器不能事后加价——这也正是上面那条“不超过声明最高价”的强制之所以能成立的结构原因。

总费用公式里那些看得见的常数

文档给出的总费用由三段相加,每段都带着若干写死的常数,值得核对而不是背。L1 gas 那一段里,一条 L2 到 L1 消息的 calldata 成本记为 1,124 gas,一段日志数据的成本是 256 gas,向以太坊新存储槽写入的成本是 20,000 gas,还有一项日志消息到 L1 的成本记为 1,637 gas;消息条数与各自的有效载荷大小会成倍放大这些项。二层那一段以 (l2_gas_price + tip) 乘上计算与数据的总消耗,其中计算部分既可能按原始虚拟机资源(Cairo 步数与各类 builtin 的应用次数,按权重向量折算)计价,也可能按 Sierra gas 计价,取决于交易经过的是哪一类合约。

数据可用性那一段最有意思:文档按 DA 模式给了两条分支,一条对应 blob 模式,一条对应 calldata 模式,两者的成本结构与折扣不同——calldata 分支里还能看到合约更新折扣与发送方余额更新折扣两项抵扣。要比较两笔交易为什么差很多钱,先看它们当时各自落在哪种模式下,比看块平均费率更有解释力。

读账单时的几点提醒

第一,价格分三层,任何一层单独涨跌都不等于你的账单变化方向;第二,二层价跟着一层走的那部分是六十秒一次、取六十个采样的平均,短时尖峰会摊平;第三,你写的单位价上限是准入条件,不是成交价;第四,扣费由排序器作为收款人执行,与交易结果同时生效。第五,涉及治理与协议升级时,缩放系数、最低价与权重都可能变化,具体数值以 Starknet 官方文档对应版本的页面为准。

本文只解释计费机制与成本结构,不涉及任何资产价格判断,不构成投资建议。