美文网首页
Substrate中generic-asset模块分析

Substrate中generic-asset模块分析

作者: 建怀 | 来源:发表于2019-11-25 19:16 被阅读0次

Substrate中generic-asset模块分析

generic asset为相关账号和资产余额提供处理方法。

这个generic asset模块提供方法:

  • 创建一个新的资产。
  • 设置资产的权限。
  • 获取和设置自由余额。
  • 取回总的,保留的和未保留的余额。
  • 遣返保留余额给受益账号。
  • 在账号间转移自由余额,不包括保留余额。
  • 惩罚一个账号余额。
  • 管理资产总的发行量。
  • 设置和管理资产锁。

术语

  • Staking Asset:资产抵押,例如在网络中为了参与验证节点。
  • Spending Asset:需要支付的资产,比如支付交易费和gas费。
  • Permissions:一种资产的一个规则集合,定义了资产可以的操作,哪个账号能够被允许去处理这些操作。
  • Total Issuance:总发行量。
  • Free Balance:自由余额。
  • Reserved Balance:保留余额。
  • Imbalance:不平衡。
  • Lock:资产锁。

继承实现

generic asset模块提供AssetCurrency,其实现了如下的traits,如果你开发时功能跟如下的实现重合,可以直接用这些实现,可以避免重合。

  • Currency: 处理可分割资产的方法。
  • ReservableCurrency: 处理保留资产的方法。
  • LockableCurrency: 处理上锁资产的方法。
  • Imbalance: 处理资产不平衡的方法,不平衡来自总发行量和所有账号的余额加总之间不想等。

generic asset模块提供了两个AssetCurrency的类型

  • StakingAssetCurrency: 抵押功能。
  • SpendingAssetCurrency: 手续费,gas费用功能。

可调度的方法

  • create:创建一个新的资产。
  • transffer:转移可流动的自由资产。
  • update_permission:对某种资产进行权限更新。
  • mint:铸造资产,调用者需要有mint权限。
  • burn:销毁资产,调用者需要有burn权限。
  • create_reserved:创建一种新的保留资产,调用者需要root权限。

公开的方法

  • total_balance:获取某个账号下某种资产的总余额。
  • free_balance:获取某个账号下某种资产的自由余额。
  • reserved_balance:获取某个账号下某种资产的保留余额。
  • create_asset:创建一种资产。
  • make_transfer:转移自由资产。
  • make_transfer_with_event:转移自由资产,发一个Transferred的事件。
  • reserve:从自由余额移动到保留余额。
  • unreserve:从保留余额移动到自由余额。
  • slash:惩罚,而且优先惩罚自由余额。
  • reward:奖励,奖励自由余额。
  • slash_reserved:惩罚,惩罚保留余额。
  • repatriate_reserved:从某个账号的保留余额中移动到另外一个账号的自由余额。
  • check_permission:检查权限,burn,mint和update权限。
  • ensure_can_withdraw:在某个给定的理由和币额情况下,检查账号能否提现。

初始化设定

pub TotalIssuance get(fn total_issuance) build(|config: &GenesisConfig<T>| {
    let issuance = config.initial_balance * (config.endowed_accounts.len() as u32).into();
    config.assets.iter().map(|id| (id.clone(), issuance)).collect::<Vec<_>>()
}): map T::AssetId => T::Balance;

add_extra_genesis {
    config(assets): Vec<T::AssetId>;
    config(initial_balance): T::Balance;
    config(endowed_accounts): Vec<T::AccountId>;

    build(|config: &GenesisConfig<T>| {
        config.assets.iter().for_each(|asset_id| {
            config.endowed_accounts.iter().for_each(|account_id| {
                <FreeBalance<T>>::insert(asset_id, account_id, &config.initial_balance);
            });
        });
    });
}

相关文章

网友评论

      本文标题:Substrate中generic-asset模块分析

      本文链接:https://www.haomeiwen.com/subject/hbgjwctx.html