11 个版本

2.0.0-rc62020 年 8 月 20 日
2.0.0-rc52020 年 7 月 24 日
2.0.0-rc42020 年 6 月 25 日
2.0.0-rc22020 年 5 月 26 日
2.0.0-alpha.32020 年 2 月 28 日

#27 in #reserved

Apache-2.0

91KB
2K SLoC

通用资产模块

通用资产模块提供处理账户和资产余额的功能。

概述

通用资产模块提供以下功能:

  • 创建一种新的资产类型。
  • 设置资产的权限。
  • 获取和设置自由余额。
  • 检索总余额、预留余额和非预留余额。
  • 将预留余额退还给受益账户。
  • 在账户之间转移余额(如果不预留)。
  • 削减账户余额。
  • 管理总发行量。
  • 设置和管理锁定。

术语

  • 抵押资产:用于抵押的资产,以作为网络中的验证者参与。
  • 消费资产:用于支付的费用,如支付转账费、gas费等。
  • 权限:针对一种资产的规则集,定义了对该资产的允许操作以及哪些账户可以拥有它。
  • 总发行量:在系统中存在的总单位数。
  • 自由余额:不属于预留余额的部分。自由余额是大多数操作中唯一重要的余额。当此余额低于存在性存款时,账户的大部分功能将被删除。当它和预留余额都被删除时,则称账户已死亡。
  • 预留余额:预留余额仍然属于账户持有人,但已暂停。预留余额仍然可以被削减,但只能在所有自由余额都被削减之后。如果预留余额低于存在性存款,则它和任何相关功能将被删除。当它和自由余额都被删除时,则称账户已死亡。
  • 不平衡:当某些资产被贷记或借记而没有相等和相反的会计(即总发行量与账户余额之间的差异)时的情况。导致不平衡的函数将返回一个实现了 Imbalance 特质的对象,可以在您的运行时逻辑中进行管理。(如果简单地丢弃不平衡,则应自动维护任何账簿,如总发行量。)
  • 锁定:对账户的可用余额中指定金额进行冻结,直到指定的区块号。多个锁定总是作用于同一资金,因此是“覆盖”而不是“堆叠”。

实现

通用资产模块提供了 AssetCurrency,实现了以下特质。如果这些特质提供了您所需的功能,则可以避免与通用资产模块耦合。

  • Currency:处理可互换资产系统的函数。
  • ReservableCurrency:处理可以由账户预留的资产的函数。
  • LockableCurrency:处理允许流动性限制的账户的函数。
  • Imbalance:处理系统总发行量与账户余额之间不平衡的函数。当函数创建新资产(例如奖励)或销毁某些资产(例如系统费用)时必须使用此函数。

通用资产模块提供了两种类型的 AssetCurrency,如下所示。

  • StakingAssetCurrency:抵押货币。
  • SpendingAssetCurrency:用于支付的费用(如转账费、汽油费)的货币。

接口

可调度函数

  • create:创建一种新的资产类型。
  • transfer:将一些流动性自由余额转移到另一个账户。
  • update_permission:更新给定 asset_id 和账户的权限。此调用方的原点必须具有更新权限。
  • mint:铸币,增加其总发行量。此调用方的原点必须具有铸币权限。
  • burn:销毁资产,减少其总发行量。此调用方的原点必须具有销毁权限。
  • create_reserved:创建一种新的预留资产。此调用方的原点必须是根。

公共函数

  • total_balance:获取账户的某种资产类型的总余额。
  • free_balance:获取账户的某种资产类型的自由余额。
  • reserved_balance:获取账户的某种资产类型的预留余额。
  • create_asset:创建资产。
  • make_transfer:从一个账户将一些流动性自由余额转移到另一个账户。这将不会触发 Transferred 事件。
  • make_transfer_with_event:从一个账户将一些流动性自由余额转移到另一个账户。这将触发 Transferred 事件。
  • reserve:将一定金额从自由余额转移到预留余额。
  • unreserve:将最多一定金额从预留余额转移到自由余额。此函数不会失败。
  • mint_free:向账户的自由余额铸币。
  • burn_free:销毁账户的自由余额。
  • slash:从 who 的综合余额中扣除最多一定金额,优先从自由余额中扣除。此函数不会失败。
  • slash_reserved:从账户的预留余额中扣除最多一定金额。此函数不会失败。
  • repatriate_reserved:将最多一定金额从账户的预留余额转移到另一个账户的自由余额。
  • check_permission:检查执行销毁、铸币或更新的权限。
  • ensure_can_withdraw:检查账户是否能够因为给定原因提取给定金额。

用法

以下示例展示了如何在自定义模块中如何使用通用资产模块。

来自 FRAME 模块的示例

费用模块使用 Currency 特质来处理费用收取/退款,其类型继承自 Currency

use frame_support::{
	dispatch,
	traits::{Currency, ExistenceRequirement, WithdrawReason},
};
type AssetOf<T> = <<T as Trait>::Currency as Currency<<T as frame_system::Trait>::AccountId>>::Balance;

fn charge_fee<T: Trait>(transactor: &T::AccountId, amount: AssetOf<T>) -> dispatch::DispatchResult {
	// ...
	T::Currency::withdraw(
		transactor,
		amount,
		WithdrawReason::TransactionPayment.into(),
		ExistenceRequirement::KeepAlive,
	)?;
	// ...
	Ok(())
}

fn refund_fee<T: Trait>(transactor: &T::AccountId, amount: AssetOf<T>) -> dispatch::DispatchResult {
	// ...
	T::Currency::deposit_into_existing(transactor, amount)?;
	// ...
	Ok(())
}

创世纪配置

通用资产模块依赖于 GenesisConfig

许可协议:Apache-2.0

依赖项

~6–15MB
~198K SLoC