在Substrate区块链开发框架中,SRML Balances模块引用了4种不同的余额:
这些不同类型的天平之间有什么区别,它们何时在Substrate中使用,以及如何在我自己的运行时模块中使用它们?
答案 0 :(得分:2)
“余额”模块是一种综合的链式货币,可以灵活地提供许多不同的功能。
在“余额”模块的存储中,只有两个直接存储的余额:
这两个余额的总和用于计算帐户的total balance。
附加逻辑层放在自由平衡之上,以创建类似以下的抽象:
因此,让我们来看一下“余额”模块管理的不同类型的余额。
从参考文档的terminology部分开始:
可用余额:余额中未保留的部分。自由余额是大多数操作中唯一重要的余额。当该余额低于现有存款时,该帐户的大多数功能将被删除。如果同时删除了该余额和保留的余额,则该帐户被视为已死。
每次启动transfer
,withdraw
或reserve
时都会使用帐户的免费余额。在这些操作成功完成之前,将用WithdrawReason
调用ensure_can_withdraw
并检查提款不会干扰某些归属余额或锁定余额
这不会阻止发生诸如slash
之类的其他操作,这些操作并不关心任何有关自由余额的抽象。
帐户的vesting balance是其免费余额的抽象。更具体地说,拥有既得余额的帐户不能用低于其自由余额的余额进行支出。既得利益与WithdrawReason
无关。
amount_spendable = free_balance - vesting_balance
因此,即使在查询自由余额时,一个帐户似乎有很多流动资金需要花费,但帐户归属余额仍可以防止这些资金被提取。
既定的结余只能在底物链的成因上设置,并且以每个块的线性速率减少,目的是使某个账户的整个成因结余在某个块数下可用于该账户。在延迟开始归属或因削减而减少自由余额的情况下,归属余额可能大于自由余额。在这些情况下,amount_spendable
会饱和为零。
帐户的锁定余额是其免费余额的另一种抽象形式。在这种情况下,由于某种原因,有一定的金额被禁止提取。
不同的提款原因是:
因此,如果某个帐户使用WithdrawReasons::Transfer
锁定了100个单位,则它无法进行转帐,使其自由余额低于100个单位。但是,该帐户 可以执行另一项操作,例如reserve
,将其自由余额降至100个单位以下。锁可能有多种原因与之相关,在这种情况下,只能将这些资金用于其他原因。
可以在一个帐户上放置多个不同的锁,但是这些锁彼此重叠而不是堆叠。这意味着,如果一个帐户有3个100个单位的锁,则该帐户可以出于任何原因将其资金花费降至100个单位,这时这些锁将开始起作用。
锁定余额也与归属余额重叠,因为这两项是独立检查的,但是两项检查都必须通过ensure_can_withdraw
才能成功。
在terminology部分中:
预留余额:预留余额仍属于帐户持有人,但已被暂停。保留的余额仍然可以削减,但前提是必须削减所有的可用余额。如果预留的余额低于现有存款,则将删除其和所有相关功能。删除所有余额和可用余额后,该帐户就被视为已死。
相对而言,预留余额比自由余额更简单,因为它没有抽象。从用户保留的资金并不意味着会被余额模块之外的任何其他逻辑直接触及。取而代之的是,资金应首先为unreserved
,然后在free_balance
中进行修改。
储备金余额和锁定余额看上去相似,但根本不同。锁定余额具有锁定标识符,锁定资金的原因以及锁定时间的身份。保留的余额不具有这些特征,并且如果没有运行时的明确行动来保留这些资金,就无法更改。
此外,可能存在与没有平衡的自由平衡。例如,如果您为帐户的全部可用余额设置了锁定,则该帐户仍将具有可用余额,并且不会调用OnFreeBalanceZero
。但是,如果您reserve
全部资金,则自由余额将降至现有存款之下,并且OnFreeBalanceZero
将为实现此功能的模块触发。