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 神奇豆

Download history 628/week @ 2024-04-16 615/week @ 2024-04-23 644/week @ 2024-04-30 393/week @ 2024-05-07 769/week @ 2024-05-14 811/week @ 2024-05-21 993/week @ 2024-05-28 920/week @ 2024-06-04 925/week @ 2024-06-11 888/week @ 2024-06-18 1194/week @ 2024-06-25 562/week @ 2024-07-02 851/week @ 2024-07-09 1139/week @ 2024-07-16 882/week @ 2024-07-23 1010/week @ 2024-07-30

3,976 每月下载量
用于 14 个 crate(5 个直接使用)

Apache-2.0

2.5MB
49K SLoC

使用 Substrate 制作,为 Polkadot

github - polkadot

Bag-List 托盘

一种半排序链表的链上实现,具有无需授权的排序和更新操作。

托盘 API

有关此托盘公开的接口的更多信息,包括其配置特性、可调度项、存储项、事件和错误,请参阅pallet 模块。

此托盘提供了 frame_election_provider_support::SortedListProvider 的实现,并且通常可以通过此 API 被其他托盘使用。

概述

此托盘将AccountId分割成不同的袋子。在袋子内,这些AccountId以链表的形式存储为节点。此托盘随后提供遍历所有袋子的功能,基本上允许以排序的方式保留无限大的项目列表。

每个袋子都有一个分数的上限和下限范围,由Config::BagThresholds表示。袋子内的所有节点必须在袋子的范围内。如果不是,可以使用无需许可的Pallet::rebag将任何节点移动到正确的袋子。

一旦发生rebag,节点内的顺序仍然不受强制。为了将节点移动到袋子中的最佳位置,可以使用Pallet::put_in_front_ofPallet::put_in_front_of_other

关于如何在Polkadot的质押系统中使用此托盘的更多阅读,请参阅:https://polkadot.network/blog/staking-update-september-2021/#bags-list-in-depth

示例

有关rebagput_in_front_of操作的示意图,请参阅example

低级/实现细节

此托盘公开的数据结构旨在优化

  • 插入和删除。
  • 按分数遍历前*N个项目,其中项目的精确顺序并不特别重要。

进一步细节

  • 项目存储在袋子里,袋子由它们的分数范围界定(参见Config::BagThresholds)。
  • 迭代时,从最高到最低将袋子链接在一起,并从头部到尾部迭代袋子内的元素。
  • 袋子内的元素按插入顺序迭代。因此,删除一个项目然后重新插入它将恶化其在列表迭代中的位置;这减少了涉及持续删除和插入以获得更好位置的一些类型垃圾信息的激励。此外,排序粒度由每个袋子阈值的范围决定。
  • 如果项目的分数变为不再属于其当前袋子范围的价值,则项目的位置需要通过外部演员使用rebag(更新)或删除和插入来更新。

依赖项

~17–32MB
~536K SLoC