账户摘要
Substrate 使用多组公钥/私钥对来表示网络的参与者。
总览
区块链系统包含不同角色的参与者,比如验证者和普通用户。
举例来说,Substrate 节点使用提名权益证明 (NPOS) 算法来选择验证者。 验证者和提名者可能持有大量资金,所以 Substrate 中的 Staking 模块引入了抽象账户体系,以便尽可能保障资金的安全。
这些抽象是:
- 账户
- Stash Key:Stash 账户用来持有大量的资金。 因此它的私钥应尽可能安全地放在冷钱包中。
- Controller Key:Controller 账户可以代表 Stash 账户触发一些行为,比如用户的支付偏好;但它应只持有最低额度的资金用以支付交易费用。 由于它可以控制验证者的设置, 因此其私钥应该保证安全, 但是也会在需要日常维护时使用
- 会话密钥(Session Keys):会话密钥是保存在验证者客户端中的“热”密钥,用于对特定操作进行签名。 它们不应持有资金。
提示: 可通过以下链接来了解 Substrate NPoS Staking 模块 中验证者和提名者的更多信息。
账户密钥
密钥对代表一个账户,并可以控制资金,类似于其他区块链中的普通账户。 在 Substrate 的 Balances 模块中,这些账户必须有一个最低金额 (叫做 “existential deposit”) 来保证账户在存储中存在。
账户密钥是通过泛型定义的,在 runtime 中进行具体化。
还是以 Stash 账户和 Controller 账户为例,这些账户是以它们的用途进行区分的,与其底层使用的加密算法无关。 当创建 Stash 或者 Controller 账户密钥时,可以使用所有支持创建普通账户的密码学。
Stash 密钥
Stash 密钥是定义 Stash 账户的公私钥对。 这个账户就像一个 “储蓄账户”,你不应该用它进行频繁的交易。 因此,应以最安全的方式来处理其私钥,例如在安全层或用安全硬件来加以保护。
由于 Stash 密钥以离线方式进行保存,它指定了一个 Controller 账户来根据 Stash 账户资金的权重来做出与支付无关的决定。 它还可以指定一个代理账户来代表它在治理中进行投票。
Controller 密钥
Controller 密钥是定义 Controller 帐户的公私钥对。 在 Substrate 的 NPOS 模型中,Controller 密钥会代表某个账户进行验证或提名。
Controller 密钥被用于支付偏好设置,例如提名奖励的目的地址,如果是验证人,可用它设置会话密钥。 Controller 账户只需要支付交易费用,所以它只需要最少量的资金。
Controller 密钥不能用来从 Stash 账户中支出资金。 然而,Controller 账户的行为可能会导致惩罚,因此仍应妥善保管。
会话密钥
会话密钥是验证者用来签署和共识相关消息的 "热密钥"。 不应该将它们作为控制资金的账户密钥,应只应用于其指定用途。 它们可以定期更改;更改的方式是,你的 Controller 账户只需通过对会话公钥进行签名创建一个证书,并通过外部交易的形式广播该证书就可以了。 会话密钥同样是以泛型进行定义的,且在 runtime 中进行具体化。
为创建会话密钥,验证人的操作者必须证明其拥有一个密钥能够代表其 Stash 帐户 (抵押) 和提名人。 为此,他们使用自己的 Controller 密钥对该秘钥签名,从而创建证书。 然后,他们在链上发布一笔包含该会话证书的交易,来告知区块链该会话密钥代表了他们的 Controller 密钥。
Substrate 提供了允许验证者来管理他们的会话密钥的Session 模块。
强类型的封装器
你可以声明任意数量的会话密钥。 例如,Substrate 的默认节点使用 BABE、GRANDPA 和 "I'm Online" 三种密钥来组成会话密钥。 其他链可能更多或更少,这取决于链需要验证者执行哪些操作。
这些不同的会话密钥可以使用相同的加密技术,但在 runtime 逻辑中使用时的目的是完全不同的。 为了防止错误的操作使用错误的密钥,使用 Rust 强类型来封装这些密钥,以便它们彼此不兼容,并确保它们仅被用于预期目的。
密钥生成
如果会话密钥泄露,攻击者可提交导致节点被惩罚的行为。 会话密钥应该定期更改 (例如每次会话), 可通过 rotate_keys
RPC 来增加安全性。
下一步
进一步学习
例子
- 按照我们的教程来创建本地网络并生成密钥。
参考文档
请翻阅参考文档,以获取更多关于 会话密钥 runtime API 的信息。
查看
substrate_application_crypto
,它用于构造特定场景的强类型加密包装器。