会话密钥
验证人使用会话密钥对共识相关的信息签名。 会议密钥
是一种通用、可索引的类型,它是在 runtime 里被指定的。
你可以声明任何数量的会话密钥。 例如,默认的 Substrate 节点使用 4个。 其他链可能更多或更少,这取决于链需要验证者执行哪些操作。
实际上,验证人会将所有会话公钥合并在单一对象中,使用 "Controller" 账户签署公钥集合并提交一份交易来注册链上的密钥。 这个链上注册过程就把验证人 节点 和带有资金的 账户 联系起来。 因此该帐户的资金会根据节点的行为被奖励或惩罚。
Runtime 声明了會包含哪些会话密钥(在 runtime/src/lib.rs
):
impl_opaque_keys! {
pub struct SessionKeys {
pub grandpa: Grandpa,
pub babe: Babe,
pub im_online: ImOnline,
pub authority_discovery: AuthorityDiscovery,
}
}
每个密钥使用的加密曲线是定义在 primitives
里。 例如,BABE 的密钥所使用的 sr25519:
mod app {
use sp_application_crypto::{app_crypto, key_types::BABE, sr25519};
app_crypto!(sr25519, BABE);
}
这个代码只是 Substrate 节点 当前 的一个例子。 最新实现方法请参考 runtime 代码。
The default Substrate node implements Session keys in the Session pallet.
生成和使用
会话密钥是必须在线上持有的 “热” 密钥。 个人密钥 不 应用于控制资金。 处理会话密钥的所有逻辑都存放在 Substrate 客户端、原始类型,和 Session 模块中。 如果一个会话密钥被泄露,攻击者可提交导致节点权益受损的行为。
Node operators can generate keys via the RPC call author_rotateKeys
. 你则需要调用 session.setKeys
函数在链上注册一对新钥匙。
通过把对会话公钥签了名的证书利用外部调用广发到网络上,钥匙会定期被更改。