3. 钱包常用知识¶
3.1. 钱包登录¶
单链钱包:只支持一条链的钱包,比方说比特币钱包。
多链钱包:支持所有币种的钱包。
单账户钱包:每种币只支持一个账户。
多账户钱包:每种币支持多个账户
钱包登录的方案三种:
类别 | 效果 |
---|---|
助记词 | 可设置新的密码,与原来不冲突 |
keystore + 钱包密码 | 须保存相对应的密码 |
私钥 |
3.2. 钱包密码¶
可用于转账确认,调用合约等,以及辅助keystore登录
3.3. 助记词¶
私钥是64位长度的十六进制的字符,不利于记录且容易记错,且每个账号对应一个私钥,多个账号就有多个私钥,不易管理,所以用算法将一串随机数转化为了一串12 ~ 24个容易记住的单词,方便保存记录。
通过助记词可以获取相关联的多个私钥,但是通过其中一个私钥是不能获取助记词的,因此助记词≠私钥。
根据助记词推算种子的算法是PBKDF2,使用的哈希函数是Hmac-SHA512,其中,输入是助记词的UTF-8编码,并设置Key为mnemonic+password,循环2048次,得到最终的64字节种子。
3.4. KeyStore¶
{
"address":"856e604698f79cef417aab...",
"crypto":{
"cipher":"aes-128-ctr",
"ciphertext":"13a3ad2135bef1ff228e399dfc8d7757eb4bb1a81d1b31....",
"cipherparams":{
"iv":"92e7468e8625653f85322fb3c..."
},
"kdf":"scrypt",
"kdfparams":{
"dklen":32,
"n":262144,
"p":1,
"r":8,
"salt":"3ca198ce53513ce01bd651aee54b16b6a...."
},
"mac":"10423d837830594c18a91097d09b7f2316..."
},
"id":"5346bac5-0a6f-4ac6-baba-e2f3ad464f3f",
"version":3
}
address: 账号地址
version: Keystore 文件的版本,目前为第 3 版,也称为 V3 KeyStore。
salt 是一段随机的盐
dk_len 是输出的哈希值的长度
n 是 CPU/Memory 开销值,越高的开销值,计算就越困难。
r 表示块大小
p 表示并行度。
id : uuid
crypto: 加密推倒的相关配置:
cipher 是用于加密以太坊私钥的对称加密算法。用的是 aes-128-ctr 。
cipherparams 是 aes-128-ctr加密算法需要的参数。在这里,用到的唯一的参数 iv。
ciphertext 是加密算法输出的密文,也是将来解密时的需要的输入。
kdf: 指定使用哪一个算法,这里使用的是 scrypt。
kdfparams: scrypt 函数需要的参数
mac: 用来校验密码的正确性, mac= sha3 (DK [16:32], ciphertext)
3.4.1. Keystore 文件的产生:¶
1、使用 scrypt 函数 (根据密码 和 相应的参数) 生成秘钥
2、使用上一步生成的秘钥 + 账号私钥 + 参数 进行对称加密。
3、把相关的参数 和 输出的密文 保存为以上格式的 JSON 文件
3.4.2. 整体流程¶
3.4.2.1. 在 Keystore 中,是用的是 Scrypt 算法,用一个公式来表示的话,派生的 Key 生成方程为:¶
DK = Scrypt(salt, dk_len, n, r, p)
3.4.3. 校验Keystore¶
当我们在使用 Keystore 文件来还原私钥时,依然是使用 kdf 生成一个秘钥,然后用秘钥对 ciphertext 进行解密,其过程如下:
无论使用说明密码,来进行这个操作,都会生成一个私钥,但是最终计算的以太坊私钥到底是不是正确的,却不得而知。
这就是 keystore 文件中 mac 值的作用。mac 值是 kdf 输出 和 ciphertext 密文进行 SHA3-256 运算的结果,显然密码不同,计算的 mac 值也不同,因此可以用来检验密码的正确性。