33次主要重大版本更新
36.0.0 | 2024年7月18日 |
---|---|
35.0.0 | 2024年7月12日 |
34.0.0 | 2024年6月24日 |
33.0.0 | 2024年5月23日 |
0.0.0 | 2022年11月21日 |
#921 in 魔法豆
5,092次每月下载
用于 61 个crate(5个直接使用)
2.5MB
40K SLoC
使用 Substrate 开发,针对 Polkadot。
快速赎回托盘
一个托盘,允许质押系统参与者(由 Config::Staking
表示,是 StakingInterface
)更快地进行赎回,前提是满足未被暴露在任何处罚条件之下。
概述
如果提名者在质押系统中任何地方都没有被曝光,即通过StakingInterface::is_exposed_in_era
(即“在过去StakingInterface::bonding_duration
天内没有积极支持任何验证者”),则他们可以在此模块中注册自己,比等待整个质押期限更快地解除质押。
与验证者曝光从质押系统的角度来看意味着与验证者获得奖励,同时也面临与验证者一起被削减的风险。这相当于这里解释的“活跃提名者”角色。
确信自己没有曝光的质押者可以使用Pallet::register_fast_unstake
进行注册。这将使质押者完全解除质押并放入待检查的队列中。
成功的注册意味着在质押系统中完全解除质押并处于冷却状态。即使快速解除质押的注册被撤销(见Pallet::deregister
和进一步),这些效果也会持续存在。
一旦注册为快速解除质押者,质押者将排队并由系统检查。这取决于需求,可能需要多个块,但几乎肯定比等待标准质押期限“更快”。
快速解除质押者要么在Queue
中,要么正在积极被检查,此时它处于Head
中。一旦在Head
中,请求就不能再撤销。但是,一旦在Queue
中,它可以通过Pallet::deregister
来撤销。
为此过程收取相当于Config::Deposit
的押金,如果成功解除质押,则押金将被退还(Event::Unstaked
信号表示)。
一旦处理成功,将不会收取检查过程的额外费用,质押者将立即解除质押。
如果失败,意味着质押者被曝光,上述押金将被削减,以补偿他们对链上浪费的工作量。
总的来说,这个模块旨在为一些质押者提供一个简单的退出途径。
示例
-
队列中有多个参与者进行快速解除质押。
-
由于提名者被曝光,快速解除质押失败。
模块API
有关此模块公开的接口的更多信息,包括其配置特质、可调度函数、存储项、事件和错误,请参阅pallet
模块。
低级/实现细节
此模块基于on_idle
进行工作,这意味着它不保证何时成功,如果根本不成功。此外,队列实现是无序的。在拥堵的情况下,不提供先入先出的排序。
基于基于on_idle
的实现,可以得出以下一些重要考虑
-
本托盘的重量必须正确。在
Pallet::on_idle
内部的代码必须能够在执行后测量自身并正确报告剩余的重量。 -
如果重量测量不正确,可能导致永久超重(因此变慢)的块。
-
重量消耗量是
on_idle
的直接函数,与ErasToCheckPerBlock
有关。 -
因此,应选择正确的
ErasToCheckPerBlock
值(可以通过Pallet::control
设置),以确保on_idle
使用合理的重量。如果ErasToCheckPerBlock
设置得太高,on_idle
总会得出结论说它没有足够的重量继续进行,并将提前返回。不过,只要基准测试/重量是准确的,这也应该是安全的。 -
有关更多详细信息,请参阅
do_on_idle
(私有)中的内联代码注释。 -
为了进一步的安全,在发生任何不可预见错误的情况下,该组件将发出
Event::InternalError
并将ErasToCheckPerBlock
重置为 0,这实际上意味着组件将停止/禁用自身。
依赖项
~17–32MB
~542K SLoC