sr25519概述和理解

最近在搞substrate的sdk时,一直纠结怎样从keystore导入的账户中导出私钥?经过这几天的踩坑和学习,才知道这个是不可能导出的。网上也没找到什么直观的文章来解释,只好通过代码调试来了解。密码学太过深奥,这里我只结合自己的理解,把这个原因和过程记录一下。

1. 简介

在众多区块链项目中,密钥和keystore是可以相互导出的。但在substrate中使用钱包时,你会发现密钥可以导出keystore,但Keysotre却无法重新获取密钥,这是因为substrate使用了sr25519这样一套密码学规则,它可以生成密钥账户、消息签名等。具体机制我逐步讲解下。

2. sr25519结构

我抛开密码学专业解释以及一些枯燥的图示,通俗的来说下。sr25519的结构分为三部分:
seedkeynonce

2.1 seed

种子数据,32字节。
substrate中的私钥,就是通过它转化出来的。这块会涉及到sr25519更深的结构,但作为非密码学专业的我们,可以先不必去深入了解欸。只需要知道seed即为私钥或者助记词。
seed作为私钥,自然可以生成公钥以及对应的不同networid的地址

2.2 key、nonce

key是seed生成的,32字节。
通过对源码的了解,我发现seed通过hash512生成了key,也就是说,这个过程是不可逆的。key无法重新恢复seed(请记住这句话)
而nonce是生成key时,生成的固定值,32字节。
在sr25519中,使用的是key来签名消息,而不是直接使用seed。

3. keystore

通过私钥或者助记词,可以导出一个keystore。
这里我直接贴一个keystore结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
{
"encoded":"mD7nc88uUIpeRG4+mfw5bfZxCTM1Gp8xoCHtAGtC4m0AgAAAAQAAAAgAAAClmfyOli5KEtwM/PgHojaTuD6vsd1XeKEU/ZdlQ1LH/RWEQOd+wXdsA1AyRSi6XseDx6ZZvfr8L07IFY9E2f79ysEcogEmSQ3dU2pVqLulnLYex8Rjkef6Ac52mN4BnGrDuZ5puoe5pN2Qmn9WZ/+OP3tYRKXXnHnTDge389HbdsNpxhXQUJ06+g7WA6NFgclABG2TG1UfMNup52TD",
"encoding":{
"content":[
"pkcs8",
"sr25519"
],
"type":[
"scrypt",
"xsalsa20-poly1305"
],
"version":"3"
},
"address":"5FnTy68oYwMVE8J7VRMczJVyJrTv9U4P5M7YnwWcFy8C8Xck",
"meta":{
"genesisHash":"",
"name":"testM1",
"whenCreated":1681128297037
}
}

其实只要关注encoded,它包含了一个账户的Keystore密码、公钥、key、nonce等信息,输入正确的密码,即可解析到:公钥、key、nonce值(解析过程这里就不说了,感觉没必要,字节码按长度规范截取转码等过程),这里你也就会明白keystore中是没有私钥的。
通过公钥,你可以生成不同networkid的地址,
通过key,你可以给消息签名、转账签名等。
结合前文sr25519的结构让你记住的话key无法重新恢复seed,你会明白keystore是无法获取私钥的。
这里记录个信息,从encoded中会导出一个64字节的二进制数据,其中前32字节是key,后32字节是nonce。

4. 综述

  1. 本文还有很多内容我没有提到,包括助记词或者密钥怎么转换成seed、中间各阶段数据如何解析的等等。这里只是大概讲了下sr25519的规则,对大家有个宏观上的了解,然后有必要了再去进一步研究。对我而言,解决了文章开头提到的最大的疑惑。
  2. 按官方解释,substrate选择sr25519的目的是为了能让账户更加安全。不同于常规的账户体系,如果不了解该算法,硬按着常规方式搞,会走不少弯路
  3. sdk源码可供参考,代码位置:my-token 如果没放出代码来,就是还在搞,最终肯定放出来
  4. 最后总结一下:
    私钥或者助记词可以导出keystore,但keystore是不可导出私钥或助记词的。
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2017-2023 Jason
  • Visitors: | Views:

谢谢打赏~

微信