【Bybit交易所官网】怎么使用Substrate Balances模块?
Substrate Balances模块主要提供处理账户和余额的功能。本文主要整理了Balances模块的以下内容:
-
主要术语
-
实现的功能
-
实现的trait
-
SRML中的示例
主要术语
具体涉及到的术语如下:
-
最少存款或押金(Existential Deposit):创建或开设帐户所需的最低余额。这样可以防止“粉尘帐户”填满存储。
-
总发行量(Total Issuance):系统中存在的单位总数。
-
回收帐户(Reaping an account):通过重置其nonce值来删除帐户的行为,在其余额置为零后发生。
-
可用余额(Free Balance):余额中未储备的部分。可用余额是大多数操作中唯一重要的余额。当该余额低于最少存款时,该帐户的大多数功能将被删除。当它和储备余额都被删除时,该帐户被视为已失效。
-
储备余额(Reserved Balance):储备余额仍属于帐户持有者,但被暂停。储备余额仍然可以削减,但前提是必须已削减了所有的可用余额。如果储备余额低于最少存款,则将删除所有相关功能。当它和可用余额都被删除时,则该帐户被视为已失效。
任何账户的可用余额或储备余额都不得在0和最少存款(不包括)之间。如果发生这种情况,则表明该模块存在错误或存储的原始突发错误。
-
不平衡(Imbalance):一些资金借贷不相等或相反的会计情况(比如,总发行额与帐户余额之间的差额)。导致不平衡的函数将返回
Imbalance trait
的对象,该对象可以在 Runtime 逻辑中进行管理。如果只是减少不平衡,应该自动维护所有记账,例如总发行。 -
锁定(Lock):是指冻结帐户指定数量的可用余额,直到指定的区块号。对同一笔资金进行多个锁定操作,它们是“重叠”而不是“堆积”。
-
授予(Vesting):类似于锁定,这是另一个独立的流动性限制,随时间线性减少。
实现的功能
在pallet_balances::Module
中提供的接口有:
-
transfer
,将一些流动的可用余额转入另一个帐户。
#[weight = SimpleDispatchInfo::FixedNormal(1_000_000)]
pub fn transfer(
? ?origin,
? ?dest: <T::Lookup as StaticLookup>::Source,
? ?#[compact] value: T::Balance
)
-
set_balance
,设置给定帐户的余额,此调用的origin
必须是root
。
#[weight = SimpleDispatchInfo::FixedOperational(50_000)]
fn set_balance(
? ?origin,
? ?who: <T::Lookup as StaticLookup>::Source,
? ?#[compact] new_free: T::Balance,
? ?#[compact] new_reserved: T::Balance
)
具体功能包括:
-
获取并设置可用余额。
-
检索总余额,储备余额和可用余额。
-
将储备的余额返还至现有的受益人帐户。
-
在帐户之间转移余额(未储备时)。
-
削减帐户余额。
-
帐户创建和删除。
-
管理总发行量。
-
设置和管理锁定。
实现的trait
提供并实现的trait
包括frame_support::traits
中的:
-
Currency
:处理可替代资产(fungible assets)系统的功能。 -
ReservableCurrency
:处理可以从帐户中储备资产的功能。 -
LockableCurrency
:处理允许流动性限制的帐户的功能。 -
Imbalance
:用于处理系统中的总发行量与帐户余额之间不平衡的功能。创建新资金(例如奖励)或销毁一些资金(例如系统费用)时必须使用。
以及frame_system
中的:
-
IsDeadAccount
:检测程序,用于说明给定帐户是否未使用。
SRML中的示例
来自SRML
中的示例,展示了如何在自定义模块中使用Balances模块。
// bin/node/runtime/src/lib.rs
type NegativeImbalance = <Balances as Currency<AccountId>>::NegativeImbalance;
Contract
模块使用Currency trait
来处理Gas的支付,其类型继承自Currency
。
// frame/contracts/src/lib.rs
pub type BalanceOf<T> = <<T as Trait>::Currency as Currency<<T as frame_system::Trait>::AccountId>>::Balance;
pub type NegativeImbalanceOf<T> =
? ?<<T as Trait>::Currency as Currency<<T as frame_system::Trait>::AccountId>>::NegativeImbalance;
pub trait Trait: frame_system::Trait {
? ?type Currency: Currency<Self::AccountId>;
? ?/// 支付Gas时减少imbalance的处理器
? ?type GasPayment: OnUnbalanced<NegativeImbalanceOf<Self>>;
}
Staking
模块使用LockableCurrency trait
来锁定stash帐户的资金。
// frame/staking/src/lib.rs
pub trait Trait: frame_system::Trait {
? ?/// 抵押余额
? ?type Currency: LockableCurrency<Self::AccountId, Moment=Self::BlockNumber>;
}
impl<T: Trait> Module<T> {
? ?/// 更新controller的账本及更新stash锁定。
? ?fn update_ledger(
? ? ? ?controller: &T::AccountId,
? ? ? ?ledger: &StakingLedger<T::AccountId, BalanceOf<T>>
? ?) {
? ? ? ?T::Currency::set_lock(
? ? ? ? ? ?STAKING_ID,
? ? ? ? ? ?&ledger.stash,
? ? ? ? ? ?ledger.total,
? ? ? ? ? ?WithdrawReasons::all(),
? ? ? ?);
? ? ? ?<Ledger<T>>::insert(controller, ledger);
? ?}
}
希望可以帮助大家更好地理解和使用 Balances 模块进行 Runtime 开发。
参考文档:https://substrate.dev/rustdocs/pre-v2.0-3e65111/pallet_balances/index.html
点击【阅读原文】可查看知乎专栏更多内容。
- 免责声明
- 世链财经作为开放的信息发布平台,所有资讯仅代表作者个人观点,与世链财经无关。如文章、图片、音频或视频出现侵权、违规及其他不当言论,请提供相关材料,发送到:2785592653@qq.com。
- 风险提示:本站所提供的资讯不代表任何投资暗示。投资有风险,入市须谨慎。
- 世链粉丝群:提供最新热点新闻,空投糖果、红包等福利,微信:juu3644。