11 个版本
2.0.0-rc6 | 2020 年 8 月 20 日 |
---|---|
2.0.0-rc5 | 2020 年 7 月 24 日 |
2.0.0-rc4 | 2020 年 6 月 25 日 |
2.0.0-rc2 | 2020 年 5 月 26 日 |
2.0.0-alpha.3 | 2020 年 2 月 28 日 |
#27 in #reserved
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