Skip to content
This repository has been archived by the owner on Dec 10, 2020. It is now read-only.

Latest commit

 

History

History
61 lines (38 loc) · 3.58 KB

手续费模型.md

File metadata and controls

61 lines (38 loc) · 3.58 KB

ChainX的手续费模型

ChainX参考了以太坊,波卡的手续费系统,设计了一套特有的手续费模型。

ChainX手续费的基础概念:

  1. 交易权重 weight
  2. 交易基础费transaction_base_fee
  3. 交易字节费transaction_byte_fee
  4. 交易加速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,应由用户选择提供的数值。

ChainX的手续费计算方式:

fee = (transaction_base_fee * weight + transaction_byte_fee * len(交易长度)) * accelerate

由该计算方式可以看到,其中:

  • weighttransaction_base_feetransaction_byte_fee由ChainX链上提供
  • 交易长度lenaccelerate由交易发送方决定

ChainX提供的手续费相关接口

当前ChainX提供了2个于手续费计算相关的rpc

  1. chainx_getFeeByCallAndLength

    该接口传递交易编码过的function原文(注意不是交易体,是交易体中的function部分),交易长度,可以在ChainX节点中计算获取 未加速前的手续费值。

  2. chainx_getFeeWeightMap

    该接口可获取当前ChainX链上的weight列表,transaction_base_feetransaction_byte_fee。开发者可根据这三个参数在本地根据上述公式计算得到应付的手续费。

计算手续和获取手续费实例

  1. 发交易前:

    使用js-sdk组装交易,这里首先定义签名前的call(即该交易的方法),以及签名后的交易整体extrinsic,及记录发送该交易的accelerate

    1. 编码call获取encode(call)的bytes串
    2. 编码extrinsic获取到encode(extrinsic)的bytes串,并取得长度len=len(encode(entrinsic))
    3. 将1,2中的结果作为参数使用rpc chainx_getFeeByCallAndLength 调用后可获取得到基本手续费 fee
    4. 最终手续费为:final_fee = fee * accelerate
  2. 发交易后:

    1. 解析这条交易对应的events,可以获取到FeeForJackpot(AccountId, Balance)FeeForProducer(AccountId, Balance),其中Balance部分即为手续费。
    2. 发起交易的用户扣取的总共的手续费为FeeForJackpot.Balance + FeeForProducer.Balance
    3. FeeForJackpot代表将发起交易的用户扣取的手续中,给当前出块者对应的奖池的部分。
    4. FeeForProducer代表将发起交易的用户扣取的手续中,给当前出块者的部分。
    5. 注意事件FeeForJackpotFeeForProducer分别同时对应着针对资产移动的Move事件,但是当交易的发起者就是该区块的出块者时,只有FeeForJackpot对应着一笔资产Move,而FeeForProducer没有对应的Move事件(因为是自己转给了自己)