cumulus collator-selection Pallet 解析:Parachain 如何实现开放出块与提名集(完整指南)
【免费下载链接】cumulusWrite Parachains on Substrate项目地址: https://gitcode.com/gh_mirrors/cum/cumulus
cumulus是 Polkadot 生态中用于在 Substrate 上编写 Parachain(平行链)的官方框架,而collator-selection Pallet正是它实现「开放出块」的核心组件:它管理出块者(Collator)的提名集与最终集,通过「不可变出块者 + 社区候选者」两层结构,让任何满足条件的账户都能质押押金参与 Parachain 出块。本文带你快速读懂这套提名集机制的设计思路。
🧩 它解决什么问题?
在 Parachain 中,出块者(Collator)负责组装区块候选并提交给 Relay Chain 验证。与传统链的固定验证者不同,Parachain 往往希望开放出块权限:任何人都可以注册成为候选出块者。
collator-selection Pallet 就是为这件事而生的「提名集管理器」,源码位于 pallets/collator-selection/src/lib.rs。官方在模块文档中明确了一个重要定位:出块本身不是高安全活动(最终安全性由 Relay Chain 保障),因此该 Pallet 不做复杂的博弈论机制,而是用简单透明的规则维护一个健康的出块者集合。
🏛️ 两层结构:Invulnerable 与 Candidates
最终生效的 Collator 集合由两个名单聚合而成:
| 名单 | 谁任命 | 是否可被踢除 | 特点 |
|---|---|---|---|
| Invulnerables(不可变出块者) | 治理层 | ❌ 永不淘汰 | 永远在出块集合中 |
| Candidates(社区候选者) | 自我提名 | ✅ 长时间不在线会被踢 | 先到先得,上限MaxCandidates |
Invulnerables必须由治理(UpdateOrigin)设置,且账户必须先注册 Session 密钥,未注册的账户会被跳过并触发InvalidInvulnerableSkipped事件。Candidates通过register_as_candidate调用自我提名,核心条件是:已注册 Session 密钥 + 能质押CandidacyBond(候选押金,会被 reserve 锁定)。- 两个集合应当互斥:调用
add_invulnerable时,若该账户是候选者,会自动从 Candidates 中移除。
🎯 提名集如何运转?押金、踢除与最小保证
这是本 Pallet 最有「治理感」的部分:
- 押金机制:注册候选时锁定
CandidacyBond,调用leave_intent退出时押金立即退还(但实际退出要等下一个 Session 切换才生效)。 - 踢除懒惰者:每次新 Session 开始时(
new_session),Pallet 会调用kick_stale_candidates——凡是在KickThreshold个区块内没有出过块的候选者,会被移出集合并退还押金。 - 最小出块保证:任何操作(退出、移除 Invulnerable)如果会让总出块者数量跌破
MinEligibleCollators,都会被拒绝(报TooFewEligibleCollators),确保链上永远有人能出块。 - 上线保护:候选者注册时的「首次出块时间」被记为当前区块 +
KickThreshold,避免新注册者因 Session 延迟而被误踢。
每个 Session 切换: Candidates ──踢除懒惰者──> 活跃候选 Invulnerables + 活跃候选 ──> 最终 Collator 集合💰 奖励分配:Pot 账户是怎么分钱的?
Pallet 维护一个链上「金库」账户(由PotId生成,官方链上为PotStake)。每出一个区块,出块者自动获得两笔奖励:
- Pot 余额的一半(扣除最小存在量 ED);
- 区块内交易费的一半,另一半交易费回流进 Pot。
这意味着想让出块者拿到奖励,只需先向 Pot 账户转入一笔资金即可,实现极简。
⚙️ 关键配置参数速查
以 Asset Hub(Polkadot)的 Runtime 配置为例(参见 parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs):
| 参数 | 取值 | 含义 |
|---|---|---|
MaxCandidates | 100 | 社区候选者上限 |
MinEligibleCollators | 4 | 出块者下限(保底出块能力) |
MaxInvulnerables | 20 | 治理任命出块者上限 |
KickThreshold | 1 个 Session(6 小时) | 不在线超过此值即被踢除 |
UpdateOrigin | Root 或 StakingAdmin(XCM 治理) | 谁有权改参数 |
值得注意的是UpdateOrigin采用了EitherOfDiverse<EnsureRoot, EnsureXcm<IsVoiceOfBody<...>>>的组合——不仅 Root 可以管理,Relay Chain 通过 XCM 发出的治理指令也能直接操作提名集,这是开放出块治理化的关键设计。
🚀 新手动手:如何成为候选出块者?
在类似 parachain-template/runtime/src/lib.rs 的链上,参与开放出块的步骤是:
- 使用
session setKeys为本账户注册 Session/Aura 出块密钥(未注册会报ValidatorNotRegistered); - 确保余额可质押
CandidacyBond; - 调用
collatorSelection registerAsCandidate完成提名(先到先得,超过DesiredCandidates时会被TooManyCandidates拒绝); - 保持节点在线——每个 Session 结束时,
KickThreshold内没出过块就会被踢出并退还押金。
📁 源码地图
- 核心逻辑(提名、踢除、奖励、Session 管理):
pallets/collator-selection/src/lib.rs - 权重与基准测试:
pallets/collator-selection/src/weights.rs、pallets/collator-selection/src/benchmarking.rs - 存储版本迁移:
pallets/collator-selection/src/migration.rs - 集成示例:
parachains/runtimes/assets/asset-hub-polkadot/src/lib.rs与parachains/runtimes/bridge-hubs/bridge-hub-polkadot/src/lib.rs
✅ 小结
cumulus 的 collator-selection Pallet 用「两层提名集 + 押金 + 懒惰踢除 + 最小保底」四个简单机制,就实现了 Parachain 的开放出块:治理者提供稳定底座(Invulnerables),社区通过质押押金自由进出候选池(Candidates),出块奖励通过 Pot 自动分配。规则简单透明,却恰好满足了开放出块所需的弹性与安全底线。
【免费下载链接】cumulusWrite Parachains on Substrate项目地址: https://gitcode.com/gh_mirrors/cum/cumulus
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考