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