54 个版本 (35 个主要版本更新)
37.0.0 | 2024 年 7 月 18 日 |
---|---|
36.0.0 | 2024 年 7 月 12 日 |
35.0.0 | 2024 年 6 月 24 日 |
34.0.0 | 2024 年 5 月 23 日 |
2.0.0-alpha.5 | 2020 年 3 月 24 日 |
#4 in #account-id
每月 11,963 次下载
用于 103 个 包(46 个直接使用)
3MB
57K SLoC
会话模块
会话模块允许验证者管理他们的会话密钥,提供更改会话长度的功能,并处理会话轮换。
概述
术语
- 会话:会话是一段时间,具有一组固定的验证者。验证者只能在会话更改时加入或退出验证者集。它以区块数量来衡量。结束会话的区块由
ShouldEndSession
特质确定。当会话结束时,可以通过OnSessionEnding
实现选择新的验证者集。 - 会话密钥:会话密钥实际上是几个放在一起的密钥,它们提供了网络权威/验证者执行其职责所需的各项签名功能。
- 验证者 ID:每个账户都有一个关联的验证者 ID。对于一些简单的委托系统,这可能只是账户 ID 的相同。对于使用存档/控制器模型的委托系统,验证者 ID 将是控制器的存档账户 ID。
- 会话密钥配置过程:会话密钥使用
set_keys
设置,用于下一会话之后的会话。它们存储在NextKeys
中,这是一个调用者ValidatorId
与提供的会话密钥之间的映射。set_keys
允许用户在成为验证者之前设置其会话密钥。由于它使用ensure_signed
,这是一个公开调用,它检查原始来源是否为已签名账户。因此,存储在NextKeys
中的原始账户 ID 可能不一定与区块作者或验证者相关联。账户的会话密钥在其账户余额为零时将被删除。 - 会话长度:此组件不假设每个会话的长度。相反,它依赖于
ShouldEndSession
的实现来决定新会话的开始。此组件提供了PeriodicSessions
结构,用于简单的周期性会话。 - 会话轮换配置:配置为“正常”(可奖励的会话,其中应用奖励)或“异常”(可惩罚)的会话轮换。
- 会话轮换过程:在每块的开始,
on_initialize
函数查询提供的ShouldEndSession
实现。如果会话应结束,则从存储中获取新激活的验证者 ID 和会话密钥,并传递给SessionHandler
。由SessionManager::new_session
提供的验证者集和相应的会话密钥(这些密钥可能在前一阶段通过set_keys
注册)被写入存储,在那里它们将在下一个会话之前等待,然后传递给SessionHandler
。
目标
会话组件旨在实现以下功能
- 为即将到来的会话设置验证者集的会话密钥。
- 控制会话的长度。
- 配置并在正常或异常会话轮换之间切换。
接口
可调用的函数
set_keys
- 为即将到来的会话设置验证者的会话密钥。
公共函数
rotate_session
- 切换到下一个会话。注册新的权限集。为下一个会话轮换排队更改。disable_index
- 通过索引禁用验证者。disable
- 通过验证者 ID 禁用验证者
使用方法
FRAME 的示例
抵押组件使用会话组件来获取验证者集。
use pallet_session as session;
fn validators<T: pallet_session::Config>() -> Vec<<T as pallet_session::Config>::ValidatorId> {
pallet_session::Validators::<T>::get()
}
相关组件
许可证:Apache-2.0
依赖
~17–32MB
~539K SLoC