# StarkNet Alpha 的费用机制

By [Untitled](https://paragraph.com/@0x98fa2da8e15bcfaf15734d4182c220b079a4ff24-2) · 2023-11-12

---

**StarkNet 的交易成本**
==================

通常来说，一笔交易的成本由几个因素决定：

1.  数据 —— 发送至 L1 的数据量：
    
    1.1 状态差异信息
    
    1.2 L2 → L1 信息的数量
    
    1.3 已消耗的 L1 → L2 信息
    
    这些数据都会在不同的 StarkNet L1 交易中以 call data 的形式发送到 L1。
    
2.  计算成本 —— 这是针对跟踪步骤 (trace steps) 的计费，包括操作系统 (OS) 步骤 (如系统调用)。包括：
    
    *   L1 证明验证
        
    *   L2 计算成本 (SHARP)
        
3.  存储成本：在交易执行期间需要进行多少读/写操作。
    
4.  交易的 L2 网络传输成本：它的调用数据和发出的事件。
    

**目前的费用机制**
===========

概括来讲，目前的解决方案是让用户/应用程序使用定序者 (Sequencer) 来估算接受 “交易” 所需要花费的成本：

[https://aws1.discourse-cdn.com/standard20/uploads/starknet1/original/1X/1df8c08d08b408df2faab1803ccb4c10afd4e045.jpeg](https://aws1.discourse-cdn.com/standard20/uploads/starknet1/original/1X/1df8c08d08b408df2faab1803ccb4c10afd4e045.jpeg)

用户要求一个新的服务 ("gas 估算服务，estimate gas service") 来估算在当前状态下运行给定 “交易” 所需的费用。该服务根据下文中的公式进行估算。这项服务由 Sequencer 公开。在内部，它将尝试根据当前的 StarkNet 状态估算处理该交易所消耗的资源。

正如下文所解释的，这个估算值将是交易成本的首个粗略的近似值。费用本身将以 ETH (支付货币) 来指定，而 gas 价格作为估算服务的参数提供。

在这一点上，用户可以选择是否接受所估算的费用，或标记更高/更低的费用。然后，用户确定其愿意支付的费用并进行签名，这个签名也作为交易的一部分被发送到 Sequencer 中，以便执行这笔交易并添加到未来的区块中。

**成本公式**
--------

对于费用的首个近似值，我们考虑了服务提供商 (sequencer 定序者 + prover 证明者) 支付的一些外部成本，如用于数据和计算的 L1 gas (上述的第 1 和 2.1 项)。计算的费用可能包括一个加价，以补偿 L1 gas 成本的波动。在这一点上，我们忽略了证明创建、存储操作和网络的 L2 成本 (上述的第 2.2、3、4 项)。

因此，在这个阶段，计算费用的公式将是：

![](https://storage.googleapis.com/papyrus_images/d14dfb60e35d8dc1ef14b7fcdf49bfe45e1e266df98230b790efec2678622e5f.png)

其中:

1.  _gas_\__price_ 是服务中配置的 gas 价格，每 gas 单位使用多少 ETH。这个价格以后可以通过 API 查询。
    
2.  _gas\_per\_byte_ 是存储调用数据时单个字节的 gas 成本，目前为每个字节 16 gas。
    
3.  _♯(msgs)_ 是交易从 L2 到 L1 发送的信息数量。
    
4.  _bytes\_per\_msg_ 是消息的字节数。当然，每个消息的字节数都可以不同，所以我们可以使用所有消息的平均消息字节大小。
    
    额外的 5000 gas 是用来更新一个内部计数器的。
    
5.  _♯(state\_dif f\_items)_ 是该交易所做的状态差异的数量。
    
    2⋅31 分别代表每次存储写入时需写入两个字段元素，每个字段元素由 31 个字节组成。
    
6.  gas\_per\_step 是 (L1 上) 单步验证的一个常数定价。
    
    _stepstxn_ 是该函数执行的步骤数。
    

> 注意：该交易费成本的大头在于 L1 数据部分。这包括状态差异和消息。换句话说，与在 L1 上发布数据的成本相比，计算成本可以忽略不计。 (gas\_per\_step << gas\_per\_byte)

**未来的计划**
=========

这个机制在未来可能会有几种变化。

首先，我们希望进行一些优化以减少成本。具体来说，当几笔交易共享相同的证明时，它们也共享一些开销，因此会降低生产区块和验证的成本。在这种情况下，可以对原始交易的估算费用进行一些削减。

引入 volition 用于数据可用性 (即链下数据可用性)，从而可以提供另一个节约成本的方式，我们希望将其纳入成本估算的因素。为基于 L2 的数据所做的存储修改可能会产生不同的成本。

当网络变得去中心化时，我们会采用其他机制和市场设计，其中细节目前正在研究中。一个例子是使用 “费用拍卖” 模式 —— 用户可以使用不同成本组成的某种线性组合进行付费，并允许 sequencer 挑选付费最高的交易。

最后，引入费用抽象将允许网络参与者使用 ETH 以外的代币进行付费。

---

*Originally published on [Untitled](https://paragraph.com/@0x98fa2da8e15bcfaf15734d4182c220b079a4ff24-2/starknet-alpha)*
