Skip to main content

确定性交易费用

目前,交易包括一个费用字段,表示插槽领导者处理交易时允许收取的最大费用字段。 而集群则商定一个最低费用。 如果网络拥挤,插槽领导者可能会优先处理提供较高费用的交易。 这意味着在交易被集群确认并检查剩余余额之前,客户端不会知道获得了多少费用。 这闻起来正是我们不喜欢的以太坊"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。 如果验证者没有硬件可以那么快地处理那么多交易,它的确认票最终会变得很长,以至于集群将被迫启动它。