---
title: 确定性交易费用
---

目前，交易包括一个费用字段，表示插槽领导者处理交易时允许收取的最大费用字段。 而集群则商定一个最低费用。 如果网络拥挤，插槽领导者可能会优先处理提供较高费用的交易。 这意味着在交易被集群确认并检查剩余余额之前，客户端不会知道获得了多少费用。 这闻起来正是我们不喜欢的以太坊"Gas"，非确定性的味道。

## 拥堵引起的费用

验证节点使用_signatures per slot_\(SPS\) 来估计网络拥堵，然后通过_SPS target_来估计集群的期望处理能力。 验证节点从genesis config中获得SPS target信息，而它从最近处理的事务中计算SPS。 Genesis config还定义了一个目标`lamports_per_signature`，这是集群在_SPS target_运行时对每个签名收取的费用。

## 费用计算

客户端使用 JSON RPC API 来查询集群的当前收费参数。 这些参数被标记了一个区块哈希，并保持有效，直到该区块哈希足够老，被插槽领导者拒绝。

在向集群发送交易之前，客户端可以将交易和收费账户数据提交给一个名为_收费计算器_的SDK模块。 只要客户端的SDK版本与插槽领导者的版本相匹配，客户端就可以保证其账户被更改的lamports数量与费用计算器返回的数量完全相同。

## 费用参数

在该设计的第一个实现中，唯一的收费参数是`lamports_per_signature`。 集群需要验证的签名越多，费用越高。 具体的lamports数量由SPS与SPS目标的比例决定。 在每个时段结束时，当SPS低于目标值时，集群会降低`lamports_per_signature`，当高于目标值时，集群则会相应提高它的值。 `lamports_per_signature`的最小值是目标`lamports_per_signature`的50%，最大值是目标lamports_per_signature的10倍。

未来的参数可能包括：

- `lamports_per_pubkey` - 加载一个账户的费用
- `lamports_per_slot_dimit` - 加载非常老的账户费用较高
- `lamports_per_byte` - 按账户大小加载的费用
- `lamports_per_bpf_instruction` - 运行一个程序的成本

## 攻击

### 劫持SPS目标

一群验证节点如果能说服群组将SPS目标提高到其他验证者能跟上的程度，就可以将群组集中起来。 提高目标会导致费用下降，大概创造更多的需求，从而提高TPS。 如果验证者没有硬件可以那么快地处理那么多交易，它的确认票最终会变得很长，以至于集群将被迫启动它。
