Substrate中generic-asset模块分析
2019-11-25 本文已影响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);
});
});
});
}