substrate2.0中的多资产模块generic-asset

说明

  • 这是一个多资产管理模块
  • 这个模块之中有两个特别的资产:StakingAssetCurrency、SpendingAssetCurrency。分别用于两种用途:staking和转账手续费等。
  • 琐仓方法(set_locks)只有在StakingAssetCurrency中使用

重要数据存储

  • TotalIssuance查询某个资产下面的总发行量
  • FreeBalance查询某个人在某资产下面的余额
  • Permissions 查询某个资产对应的权限

重要方法

  • 创建资产
    • 代码: fn create(origin, options: AssetOptions<T::GenericBalance, T::AccountId>)
    • 参数:
   /// Initial issuance of this asset. All deposit to the creator of the asset.
   #[codec(compact)]
   pub initial_issuance: Balance,   // 创建资产总额
   /// Which accounts are allowed to possess this asset.
   pub permissions: PermissionLatest<AccountId>,  // 资产权限
}
pub struct PermissionsV1<AccountId> {
    /// Who have permission to update asset permission
    pub update: Owner<AccountId>,  // 谁有更新权限
    /// Who have permission to mint new asset
    pub mint: Owner<AccountId>,  //  谁有铸币权限
    /// Who have permission to burn asset
    pub burn: Owner<AccountId>,  // 谁又销毁权限
}
pub enum Owner<AccountId> {
    /// No owner.
    None,
    /// Owned by an AccountId
    Address(AccountId),
}
  • 逻辑
    • 获取下一个资产id, 创建资产
    • 资产全部放在创建账户的自由余额下面

  • 转账
    • 代码:pub fn transfer(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, #[compact] amount: T::GenericBalance)
    • 逻辑:
      • 转账金额不为0
      • 查询转出的账号该资产金额是否足够
      • 判断该资产是否可以进行转账(不是staking_asset_id都可以转账,如果是则需要满足一定条件)
      • 执行转账操作

  • 更新权限
    • 代码:fn update_permission( origin, #[compact] asset_id: T::AssetId, new_permission: PermissionLatest<T::AccountId> )
    • 逻辑
      • 查看自己是否有更新权限, 有则更新
      • <Permissions<T>>::insert(asset_id, &permissions)

  • 铸币
    • 代码:fn mint(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::GenericBalance)
    • 参数:
      • asset_id:资产id
      • to: 给谁铸币
      • amount: 铸币金额
    • 逻辑:
      • 检查自己是否有铸币权限
      • 更新该币种总金额
      • 更新对应账户的自由余额

  • 销毁币
    • 代码:fn burn(origin, #[compact] asset_id: T::AssetId, to: T::AccountId, amount: T::GenericBalance)
    • 逻辑(与铸币刚好相反)

铸币和销毁币是针对于自由余额的操作

  • root账户创建资产
    • 代码: fn create_reserved( origin, asset_id: T::AssetId, options: AssetOptions<T::GenericBalance, T::AccountId> )
    • 逻辑:
      • root权限
      • 指定一个资产id
      • 该资产转在default账户的自由余额下面

辅助方法

  • 获取个人账户下某个币种的总金额(自由余额 + 保留余额)
    • 代码:pub fn total_balance(asset_id: &T::AssetId, who: &T::AccountId)

  • 获取某个账户下某个币种的保留余额
    • 代码:pub fn reserved_balance(asset_id: &T::AssetId, who: &T::AccountId)

  • 获取某个账户下某个币种的自由余额
    • 代码:pub fn free_balance(asset_id: &T::AssetId, who: &T::AccountId)

  • 把某个币种的 部分自由余额转换成保留余额
    • 代码:pub fn reserve(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
    • 逻辑:
      • amount参数值不能低于自由余额
      • 减少自由余额,增加保留余额

与balances模块不同的是:这个模块保留多少金额,自由余额必须高于它


  • 解抵押保留余额
    • 代码:pub fn unreserve(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
    • 逻辑:
      • 如果amount比可解抵押的金额大,那么就用最大可解抵押金额
      • 增加自由余额,减少保留余额

  • 惩罚金额
    • 代码:pub fn slash(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
    • 先从自由余额中扣除,如果自由余额不够,就从保留余额中扣除(保留余额再不够,就惩罚最大保留余额)

  • 惩罚保留余额
    • 代码:pub fn slash_reserved(asset_id: &T::AssetId, who: &T::AccountId, amount: T::GenericBalance)
    • 逻辑:
      • 保留余额不够,就惩罚最大的

以上两个惩罚方法中,均没有对总发行量进行 不平衡处理,为什么?


  • 惩罚自己账上的保留余额到特定的账户
    • 代码:pub fn repatriate_reserved( asset_id: &T::AssetId, who: &T::AccountId, beneficiary: &T::AccountId, amount: T::GenericBalance, status: BalanceStatus, )
    • 逻辑:
      • amount比保留余额大,就用保留余额最大值
      • 资金有两个去处:对方的自由余额或是保留余额
      • 更新自己的保留余额

  • 检查自己是否有对应权限(相对于某种币种)
    • 代码:pub fn check_permission(asset_id: &T::AssetId, who: &T::AccountId, what: &PermissionType)

  • 设置锁
    • 代码:fn set_lock( id: LockIdentifier, who: &T::AccountId, amount: T::GenericBalance, reasons: WithdrawReasons, )
    • 逻辑:
      • 循环遍历自己拥有的锁,如果之前已经有这个锁,那就结束,没有就添加

  • 更新锁
    • 代码: fn extend_lock( id: LockIdentifier, who: &T::AccountId, amount: T::GenericBalance, reasons: WithdrawReasons, )
    • 逻辑:
      • 如果之前有这个锁, 那就用新锁与旧锁最大金额
      • 如果之前没有这个锁,那就用这个锁

  • 删除锁
    • 代码:fn remove_lock(id: LockIdentifier, who: &T::AccountId)

  • 检查自己是否能够进行本次转账操作
    • 代码:pub fn ensure_can_withdraw( asset_id: &T::AssetId, who: &T::AccountId, _amount: T::GenericBalance, reasons: WithdrawReasons, new_balance: T::GenericBalance, )
    • 逻辑:
      • 该资产不是staking_asset_id,均可以执行本次操作
      • 扣除金额后,自己的自由余额不能小余琐仓金额或者。。。。。


问题

  • 如果创建资产时候没有指定权限,是否意味着任何人都没有铸币、销毁以及更新的权限。只有转账
  • 这个default账户在那里修改,是否可以指定一个
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。