ChainX参考了以太坊,波卡的手续费系统,设计了一套特有的手续费模型。
- 交易权重
weight
- 交易基础费
transaction_base_fee
- 交易字节费
transaction_byte_fee
- 交易加速
accelerate
在ChainX中
weight
:交易可调用的方法赋予了名为weight
的权重,例如转账transfer
的权重是1,withdraw
的权重是3。weight
代表了这个交易的复杂度,或者耗费的资源,其权重的基础值是transaction_base_fee
。换句话说,几个交易赋予了多少了weight
代表着这个交易的复杂度是基本交易的几倍。weight
可由议会进行调整transaction_base_fee
:交易权重的基本值,即其代表一倍权重对应的手续费大小transaction_byte_fee
:交易每字节的手续费大小,由于交易需占用一定的空间,因此交易越大,对应的手续费就越多accelerate
:交易的加速倍数,当2个交易相同时,付出的accelerate
越高在交易池中的排序也越高,越容易被打包,对应的手续费也会耗费对应的倍数。该概念类似于以太坊的gas price
,应由用户选择提供的数值。
fee = (transaction_base_fee * weight + transaction_byte_fee * len(交易长度)) * accelerate
由该计算方式可以看到,其中:
weight
,transaction_base_fee
和transaction_byte_fee
由ChainX链上提供- 交易长度
len
及accelerate
由交易发送方决定
当前ChainX提供了2个于手续费计算相关的rpc
-
该接口传递交易编码过的function原文(注意不是交易体,是交易体中的function部分),交易长度,可以在ChainX节点中计算获取 未加速前的手续费值。
-
该接口可获取当前ChainX链上的
weight
列表,transaction_base_fee
及transaction_byte_fee
。开发者可根据这三个参数在本地根据上述公式计算得到应付的手续费。
-
发交易前:
使用js-sdk组装交易,这里首先定义签名前的
call
(即该交易的方法),以及签名后的交易整体extrinsic
,及记录发送该交易的accelerate
- 编码
call
获取encode(call)
的bytes串 - 编码
extrinsic
获取到encode(extrinsic)
的bytes串,并取得长度len=len(encode(entrinsic))
- 将1,2中的结果作为参数使用rpc chainx_getFeeByCallAndLength 调用后可获取得到基本手续费
fee
- 最终手续费为:
final_fee = fee * accelerate
- 编码
-
发交易后:
- 解析这条交易对应的
events
,可以获取到FeeForJackpot(AccountId, Balance)
与FeeForProducer(AccountId, Balance)
,其中Balance
部分即为手续费。 - 发起交易的用户扣取的总共的手续费为
FeeForJackpot.Balance + FeeForProducer.Balance
FeeForJackpot
代表将发起交易的用户扣取的手续中,给当前出块者对应的奖池的部分。FeeForProducer
代表将发起交易的用户扣取的手续中,给当前出块者的部分。- 注意事件
FeeForJackpot
和FeeForProducer
分别同时对应着针对资产移动的Move
事件,但是当交易的发起者就是该区块的出块者时,只有FeeForJackpot
对应着一笔资产Move
,而FeeForProducer
没有对应的Move
事件(因为是自己转给了自己)
- 解析这条交易对应的