在Polkadot中,我们需要通过不同的密钥和密钥类型区分不同的权限和功能。我们粗略地将这些分类为用户交互的帐户密钥,和管理节点的会话密钥。会话密钥确定了在节点管理中,除了认证过程外,不会有操作员干预。
账户密钥有一个相关联的余额,其中部分可以被锁仓,以便在质押、资源租赁以及治理中发挥作用,包括等待几种时间类型的解锁期。由于这些角色施加的限制不同,且多个解锁期是同时运行的。所以,我们允许不同锁仓活动采用不同的锁仓时间。
我们鼓励大家积极参与所有这些角色,但首先参与这些角色不可避免地偶尔需要账户签名。同时,如果将账户密钥保存在不太方便的地方会更具有物理方面的相对优势,比如保存在保险箱,但同时这也使签名就变得非常不便。为了避免这样的摩擦,我们提出了以下解决方案。
为质押而锁定资金的账户称为stash账户。所有stash帐户都需要注册链上证书,将所有验证人运行和提名的权利委派给某些控制人账户。同时,也选定一些代理密钥进行治理投票。在这种状态下,控制人账户和代理账户可以分别在质押和治理功能中为 stash 账户签名,但不能进行资金交易。
目前,账户密钥方面,我们支持 ed25519 [6]和Schnorrkel/sr25519[9]两种规格。两者都是使用Ed25519曲线的类似Schnorr的签名,因此两者的安全级别相近。对于需要硬件安全模块(HSM)支持或其他外币密钥管理方法的用户,我们推荐使用ed25519。另一方面, Schnorrkel/sr25519 提供更多区块链友好功能,如分层确定性密钥派生 (HDKD)和多重签名。
特别是,Schnorrkel/sr25519采用Mike Hamburg的Decaf[18, §7]的Ristretto压缩算法[21],Ristretto压缩算法提供Ed25519曲线的2个无扭点作为质数群。避免此类辅引子表明Ristretto使在实现复杂化协议时更加安全。Polkadot中大部分常规哈希都采用Blake2b算法,但是Schnorrkel/sr25519本身使用STROBE128 [19],是基于Keccak-f(1600)并提供非常适用于签名和非交互式零知识证明(NIZK)的哈希接口。