Skip to main content

Sui 中的 Gas

Sui 交易必须支付执行的计算成本和创建或更改事务中对象的长期存储成本。具体来说,Sui Gas 定价 规定任何交易都要支付以下燃气费用:

total_gas_fees = computation_units * reference_gas_price + storage_units * storage_price

虽然计算费用和存储费用是分开计算的,但从概念上讲,它们相似,因为它们分别通过将计算或存储单元乘以相关价格将计算或存储转换为 SUI 单位。

最后,Sui 的 存储机制 在事务删除先前存储的对象时提供存储费用回扣。因此,用户支付的净费用等于燃气费用减去与数据删除相关的回扣:

net_gas_fees = computation_gas_fee + storage_gas_fee - storage_rebate

净燃气费用的信息显示在 Sui Explorer 的每个事务块中:

在 Sui Explorer 上显示的燃气费用 Sui Explorer 上显示的事务块的燃气费用部分

燃气价格

参考燃气价格 将执行事务的实时成本转换为 SUI 单位,验证器集在每个纪元边界更新它。类似地,存储价格 将链上存储数据的长期成本转换为 SUI 单位,更新频率较低;通常在多个连续的纪元中保持不变。在正常的网络操作中,所有 Sui 用户都可以期望为计算和存储分别支付参考燃气价格和存储价格。

燃气单位

燃气单位包括:

计算单位

不同的 Sui 交易需要不同数量的计算时间进行处理和执行。Sui 通过将每个交易以计算单位的形式度量,将这些变化的操作负载转换为交易费用。一般来说,更复杂的交易需要更多的计算单位。

然而,值得注意的是,Sui 计算燃气调度采用了粗粒度的桶式方法。如果两个相对相似的交易在同一个桶中,它们将转换为相同数量的计算单位,而如果它们落在不同的桶中,则两个相对不同的交易将转换为不同数量的计算单位。最小的桶映射到 1,000 计算单位,这意味着所有落入最小桶的交易成本为 1,000 计算单位。最大的桶映射到 5,000,000 计算单位;如果交易需要更多的计算单位,它将中止。

使用粗粒度的桶式方法实现了两个重要的目标:

- 无需通过 "燃气挑战" 优化智能合约以获得燃气成本的边际收益 — 相反,你可以专注于产品和服务的跃升性改进。
- 使你可以自由调整每个指令的燃气成本,并尝试新的燃气计量方案,而不会导致显著的开发中断。这可能经常发生,因此重要的是不要指望随时间稳定的每个指令的燃气成本。
Bucket Lower ThresholdBucket Upper ThresholdComputation Units
01,0001,000
1,0015,0005,000
5,00110,00010,000
10,00120,00020,000
20,00150,00050,000
50,001200,000200,000
200,0011,000,0001,000,000
1,000,0015,000,0005,000,000
5,000,001Infinitytransaction will abort

存储单位

同样,Sui 交易取决于写入链上存储的新数据量。可变存储单位通过将存储中的字节数映射到存储单位来捕捉这些差异。当前的 Sui 调度是线性的,将每个字节映射到 100 存储单位。例如,存储 25 字节的交易成本为 2,500 存储单位,而存储 75 字节的交易成本为 7,500 单位。

重要的是,在 Sui 存储基金 模型中,用户需提前支付永久存储数据的成本,但如果删除数据,则还可以获得先前存储的数据的部分回扣。因此,你支付的存储费用的金额可以分为可回扣和不可回扣的部分。最初,可回扣的金额等于存储费用的 99%,而不可回扣的金额等于剩余的 1%。

燃气预算

你必须提交所有交易时的燃气预算。这为你支付的燃气费用提供了上限,尤其是因为有时在将交易提交到 Sui 网络之前可能难以完全预测交易的成本。

Sui 交易的燃气预算以 SUI 单位定义,如果以下条件成立,则交易成功执行:

gas_budget >= max{computation_fees,total_gas_fees}

如果燃气预算不满足此条件,则交易失败,并对燃气预算的一部分进行收费。在燃气预算不足以 covering 计算费用的情况下,将收取整个燃气预算。在燃气预算足以 covering 计算费用但不足以 covering total_gas_fees 的情况下,将收取与计算费用和变更事务输入对象相关的费用相对应的燃气预算的一部分。

最终,成功的交易要求最终用户支付交易的 total_gas_fees。然而,由于在交易处理之前完全预测计算时间可能是具有挑战性的,因此 gas_budget 条件还要求 gas_budget 至少与交易的 computation_fees 一样大,以防交易中止。在某些情况下 — 尤其是在存在高存储回扣的情况下,从而产生负净存储费用的情况下 — 燃气预算可能会高于你支付的总燃气费用。

重要的是,最小燃气预算为 2,000 MIST(.000002 SUI)。这确保即使燃气预算错误地指定并且交易中止,验证器也会获得至少 2,000 MIST 的补偿。此外,这保护了 Sui 网络免受大量具有最小燃气预算的交易的滥用。最大燃气预算为 500 亿 MIST 或 50 SUI。这保护网络免受内部乘法和拒绝服务攻击的燃气限制溢出。

正如先前提到的,存储回扣目前等于最初支付的存储费用的 99%。因为燃气预算适用于燃气费用的全部,所以通常情况下,仅当燃气预算远高于用户最终支付的净燃气费用时,交易才会通过。

Reference Gas PriceComputation UnitsStorage PriceStorage UnitsStorage RebateMinimum Gas BudgetNet Gas Fees
Simple transaction storing 10 bytes1,000 MIST1,00075 MIST1,0000 MIST1,075,000 MIST1,075,000 MIST
Simple transaction storing 10 bytes and deleting data500 MIST1,00075 MIST1,000100,000 MIST500,000 MIST475,000 MIST
Complex transaction storing 120 bytes1,000 MIST5,000200 MIST12,0000 MIST7,400,000 MIST7,400,000 MIST
Complex transaction storing 120 bytes and deleting data500 MIST5,000200 MIST12,0005,000,000 MIST2,500,000 MIST-100,000 MIST