56 个版本 (35 个主要版本更新)
38.0.0 | 2024 年 7 月 18 日 |
---|---|
37.0.0 | 2024 年 7 月 12 日 |
36.0.0 | 2024 年 6 月 24 日 |
35.0.0 | 2024 年 5 月 23 日 |
2.0.0-alpha.5 | 2020 年 3 月 24 日 |
1446 在 神奇豆
12,977 每月下载量
用于 170 个包(直接使用 113 个)
2MB
40K SLoC
余额模块
余额模块提供了处理账户和余额的功能。
概述
余额模块提供以下功能:
- 获取和设置自由余额。
- 检索总余额、预留余额和非预留余额。
- 将预留余额转回到一个存在的受益人账户。
- 在账户之间转账余额(非预留情况下)。
- 削减账户余额。
- 创建和删除账户。
- 管理总发行量。
- 设置和管理锁定。
术语
-
存在性存款:创建或保持账户开放所需的最小余额。这防止了“灰尘账户”填满存储空间。当免费余额加上保留余额(即总余额)低于此值时,则称账户已死亡;并且它失去了其功能以及所有先前历史,并且所有信息都将从链的状态中删除。任何账户的总余额都不应在0和存在性存款之间(不包括0)严格。
-
总发行量:一个系统中存在的单位总数。
-
收割账户:通过重置nonce来删除账户的行为。在其总余额变为零(或者,严格来说,小于存在性存款)之后发生。
-
免费余额:不属于保留部分的余额。免费余额是大多数操作中唯一重要的余额。
-
保留余额:保留余额仍然属于账户持有者,但处于暂停状态。保留余额仍然可以被削减,但只能在所有免费余额被削减之后。
-
不平衡:在某些资金被贷记或借记而没有相等的相反会计(即总发行量与账户余额之间的差异)的情况。导致不平衡的功能将返回一个可以管理于你的运行时逻辑中的
Imbalance
特质对象。(如果不平衡简单地被丢弃,它应该自动维护诸如总发行量之类的任何簿记。) -
锁定:在指定块号之前,冻结账户的指定金额的免费余额。多个锁定总是作用于同一资金,因此它们“覆盖”而不是“堆叠”。
实现
平衡模块提供了以下特质的实现。如果这些特质提供了您需要的功能,则可以避免与平衡模块耦合。
Currency
:处理可交换资产系统的函数。ReservableCurrency
:处理可以从账户中保留的资产的函数。LockableCurrency
:处理允许流动性限制的账户的函数。Imbalance
:处理系统总发行量与账户余额之间不平衡的函数。在创建新资金(例如,奖励)或销毁某些资金(例如,系统费用)时必须使用。IsDeadAccount
:确定器,用于判断给定的账户是否未使用。
接口
可调用函数
transfer
- 将一些流动免费余额转移到另一个账户。force_set_balance
- 设置指定账户的余额。此调用的来源必须是root。
用法
以下示例显示了如何在您的自定义模块中使用平衡模块。
FRAME示例
合同模块使用 Currency
特质来处理燃气付款,并且其类型从 Currency
继承。
use frame_support::traits::Currency;
pub type BalanceOf<T> = <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance;
pub type NegativeImbalanceOf<T> = <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::NegativeImbalance;
质押模块使用 LockableCurrency
特质来锁定托管账户的资金。
use frame_support::traits::{WithdrawReasons, LockableCurrency};
use sp_runtime::traits::Bounded;
pub trait Config: frame_system::Config {
type Currency: LockableCurrency<Self::AccountId, Moment=frame_system::pallet_prelude::BlockNumberFor<Self>>;
}
fn update_ledger<T: Config>(
controller: &T::AccountId,
ledger: &StakingLedger<T>
) {
T::Currency::set_lock(
STAKING_ID,
&ledger.stash,
ledger.total,
WithdrawReasons::all()
);
// <Ledger<T>>::insert(controller, ledger); // Commented out as we don't have access to Staking's storage here.
}
创世纪配置
平衡模块依赖于 GenesisConfig
。
假设
- 所有账户的总发行余额应小于
Config::Balance::max_value()
。
许可证:Apache-2.0
依赖关系
~17–32MB
~541K SLoC