cumulus collator-selection Pallet 解析:Parachain 如何实现开放出块与提名集(完整指南)
2026/9/24 20:16:54 网站建设 项目流程

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 最有「治理感」的部分:

  1. 押金机制:注册候选时锁定CandidacyBond,调用leave_intent退出时押金立即退还(但实际退出要等下一个 Session 切换才生效)。
  2. 踢除懒惰者:每次新 Session 开始时(new_session),Pallet 会调用kick_stale_candidates——凡是在KickThreshold个区块内没有出过块的候选者,会被移出集合并退还押金。
  3. 最小出块保证:任何操作(退出、移除 Invulnerable)如果会让总出块者数量跌破MinEligibleCollators,都会被拒绝(报TooFewEligibleCollators),确保链上永远有人能出块
  4. 上线保护:候选者注册时的「首次出块时间」被记为当前区块 +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):

参数取值含义
MaxCandidates100社区候选者上限
MinEligibleCollators4出块者下限(保底出块能力)
MaxInvulnerables20治理任命出块者上限
KickThreshold1 个 Session(6 小时)不在线超过此值即被踢除
UpdateOriginRoot 或 StakingAdmin(XCM 治理)谁有权改参数

值得注意的是UpdateOrigin采用了EitherOfDiverse<EnsureRoot, EnsureXcm<IsVoiceOfBody<...>>>的组合——不仅 Root 可以管理,Relay Chain 通过 XCM 发出的治理指令也能直接操作提名集,这是开放出块治理化的关键设计。

🚀 新手动手:如何成为候选出块者?

在类似 parachain-template/runtime/src/lib.rs 的链上,参与开放出块的步骤是:

  1. 使用session setKeys为本账户注册 Session/Aura 出块密钥(未注册会报ValidatorNotRegistered);
  2. 确保余额可质押CandidacyBond
  3. 调用collatorSelection registerAsCandidate完成提名(先到先得,超过DesiredCandidates时会被TooManyCandidates拒绝);
  4. 保持节点在线——每个 Session 结束时,KickThreshold内没出过块就会被踢出并退还押金。

📁 源码地图

  • 核心逻辑(提名、踢除、奖励、Session 管理):pallets/collator-selection/src/lib.rs
  • 权重与基准测试:pallets/collator-selection/src/weights.rspallets/collator-selection/src/benchmarking.rs
  • 存储版本迁移:pallets/collator-selection/src/migration.rs
  • 集成示例:parachains/runtimes/assets/asset-hub-polkadot/src/lib.rsparachains/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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询