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 魔法豆

Download history 848/week @ 2024-04-16 742/week @ 2024-04-23 957/week @ 2024-04-30 739/week @ 2024-05-07 1019/week @ 2024-05-14 1371/week @ 2024-05-21 1464/week @ 2024-05-28 1252/week @ 2024-06-04 1144/week @ 2024-06-11 1142/week @ 2024-06-18 1704/week @ 2024-06-25 852/week @ 2024-07-02 1300/week @ 2024-07-09 1354/week @ 2024-07-16 1157/week @ 2024-07-23 1146/week @ 2024-07-30

5,092次每月下载
用于 61 个crate(5个直接使用)

Apache-2.0

2.5MB
40K SLoC

使用 Substrate 开发,针对 Polkadot

github - 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信号表示)。

一旦处理成功,将不会收取检查过程的额外费用,质押者将立即解除质押。

如果失败,意味着质押者被曝光,上述押金将被削减,以补偿他们对链上浪费的工作量。

总的来说,这个模块旨在为一些质押者提供一个简单的退出途径。

示例

  1. 队列中有多个参与者进行快速解除质押。

  2. 由于提名者被曝光,快速解除质押失败。

模块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