手续费
每笔 ZooBC 交易都以 ZBC 支付手续费。它的最低额即下限,由每个节点根据交易本身和少数几个全网参数以相同方式算出,因此钱包在签名之前就知道它。申报的手续费中超出下限的部分会在同一区块中退还,而被保留的手续费进入向已注册节点付酬的抽奖。没有任何销毁,也没有任何单个节点或组织拿走这些手续费。
最低手续费
下限由两部分组成:
floor = base action fee × fee scale
+ price of the body and message bytes, kept for the minimum window,
× number of registered nodes
- 基础操作费为 2,500,000 个原子单位(0.025 ZBC)。没有按交易类型区分的基础手续费:一笔支付、一次代币发行和一个市场订单都从同一个基础出发。
- 手续费系数就是注册表的席位投票决定的转账手续费。它起始为 1.0,每 30 天的周期可以调整一次(价格投票)。
- 字节费按数据集的存储价格,为交易体和消息在 mainnet 上 17,280 个区块(3 天)的最短窗口内的保存计价。从 0.5.8 版本起,它要乘以前一区块时的已注册节点数量,因为每个节点都保存这些字节的一份副本。
因此,一笔简单支付的下限略高于 0.025 ZBC。节点 API 的 GET /api/v1/blockchain/estimate-fee 会在你签名之前返回下限。
申报的手续费低于下限的交易会被拒绝,携带这种交易的区块无效。类型 0 是什么都不转移的空操作交易,它仍然必须支付大于零的手续费。节点永远不会因为手续费过高而拒绝交易。批量合并到一笔交易中的多个操作,支付的是每个操作单独发送时应付金额之和,消息只计费一次(每个账户每个区块一笔交易与批量交易),每一项计算出的费用都向上取整到至少一个原子单位。
多付部分会被退还
你可以申报高于下限的手续费。区块被应用时,申报的全部手续费从你的账户中扣出,超出下限的部分则在同一区块中直接退回,在你账户的历史中显示为一条单独的退款记录。例如,一笔申报 0.02550004 ZBC 的 testnet 支付被收取 0.02500003 ZBC,退还 0.00050001 ZBC。因此,不小心多付不会让你损失任何东西。
多付也换不来任何好处。节点的等待池按节点实际保留的每字节手续费为交易排序,而这就是下限,因为多付部分会被退还;手续费相同时先按到达顺序,再按交易 id 排序。申报十倍于下限的手续费,与申报下限时的排位相同:更高的手续费买不到更靠前的位置,不能让交易在池满时免于被逐出,也无法把其他交易挤出去。
手续费去了哪里
一个区块保留的所有手续费都进入它的奖励池,与新释放的币和长效池的一部分合在一起,由 coinbase 抽奖 按 参与分数 的比例在已注册节点之间分配。产出该区块的节点对这些手续费没有任何特殊的权利。它们不会被销毁(ZBC 从不销毁),ZooBC Foundation 也不分走任何份额。
有一项单独的费用运作方式不同。在内置市场上,一笔成交的吃单手续费(起始为 0.1%,从吃单方所得中扣取)归该区块的出块者所有;挂单方不付这项费用(市场与订单)。
免手续费的职责交易
有些交易是节点为网络而不是为自己所做的工作。这些职责交易必须申报恰好为零的手续费,并且必须来自已注册节点自己的账户,即由其节点密钥构成的地址:
- SubmitStorageProof,节点证明自己保存着存储文件的分片(去中心化存储池);
- AttestEvent,节点对某一事件的见证,触发器、跨链桥和版本否决都依赖它(触发器与见证);
- SetConsensusParam、FeeVoteCommitment 和 FeeVoteReveal,即席位的价格投票(价格投票);
- EquivocationReport,证明某个出块者在同一个父区块上签署了两个区块(双签(equivocation));
- 已注册节点的在线证明,以手续费为 0 的 QueueAttendance 发送(错过轮次、暂停与除名)。
手续费为其他任何数值、或由其他任何密钥发送的职责交易都会被拒绝。免费并不意味着不受限制:对于每个职责对象(一个纪元中的一个存储分片、一个事件、一个参数、一个投票窗口),一个节点最多只能有一笔待处理的职责交易;而且职责交易在节点等待池中有自己专用的通道,因此普通流量无法把它们挤掉。
其他费用
有些功能除手续费外还有自己的费用,而且这些费用永远不会退还:托管的租金(托管)、让交易在修剪后仍被保存的存续押金(付费保存数据(存续)),以及代币的维护费(代币维护费(存续))。它们最终都进入长效池,长效池在每个区块中向节点支付一部分(资金池)。