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日 |
#910 in 神奇豆
3,976 每月下载量
用于 14 个 crate(5 个直接使用)
2.5MB
49K SLoC
使用 Substrate 制作,为 Polkadot。
Bag-List 托盘
一种半排序链表的链上实现,具有无需授权的排序和更新操作。
托盘 API
有关此托盘公开的接口的更多信息,包括其配置特性、可调度项、存储项、事件和错误,请参阅pallet
模块。
此托盘提供了 frame_election_provider_support::SortedListProvider
的实现,并且通常可以通过此 API 被其他托盘使用。
概述
此托盘将AccountId
分割成不同的袋子。在袋子内,这些AccountId
以链表的形式存储为节点。此托盘随后提供遍历所有袋子的功能,基本上允许以排序的方式保留无限大的项目列表。
每个袋子都有一个分数的上限和下限范围,由Config::BagThresholds
表示。袋子内的所有节点必须在袋子的范围内。如果不是,可以使用无需许可的Pallet::rebag
将任何节点移动到正确的袋子。
一旦发生rebag
,节点内的顺序仍然不受强制。为了将节点移动到袋子中的最佳位置,可以使用Pallet::put_in_front_of
或Pallet::put_in_front_of_other
。
关于如何在Polkadot的质押系统中使用此托盘的更多阅读,请参阅:https://polkadot.network/blog/staking-update-september-2021/#bags-list-in-depth
示例
有关rebag
和put_in_front_of
操作的示意图,请参阅example
。
低级/实现细节
此托盘公开的数据结构旨在优化
- 插入和删除。
- 按分数遍历前*N个项目,其中项目的精确顺序并不特别重要。
进一步细节
- 项目存储在袋子里,袋子由它们的分数范围界定(参见
Config::BagThresholds
)。 - 迭代时,从最高到最低将袋子链接在一起,并从头部到尾部迭代袋子内的元素。
- 袋子内的元素按插入顺序迭代。因此,删除一个项目然后重新插入它将恶化其在列表迭代中的位置;这减少了涉及持续删除和插入以获得更好位置的一些类型垃圾信息的激励。此外,排序粒度由每个袋子阈值的范围决定。
- 如果项目的分数变为不再属于其当前袋子范围的价值,则项目的位置需要通过外部演员使用rebag(更新)或删除和插入来更新。
依赖项
~17–32MB
~536K SLoC