私钥、公钥、地址
- 私钥由64位十六进制的字符组成
- 公钥由130位十六进制的字符组成
- 采用椭圆曲线数字签名算法ECDSA-secp256k1将私钥(32字节)映射成公钥(65字节,04+X公钥+Y公钥)
- 如私钥0xd07a6442307e391877a6938add8bf52e4db1637f3eff8933d6bf317641938272
生成公钥
0x04
27e7e2385c9bff65e37639b6664d785f06964102f1dc43f0086e6b2beb1e2169
5ba1e76714d3a39f562b30fe8b9988d0cae128a058beb2a868871f0fe4b047e3
- 地址由40位十六进制的字符组成
- 移除公钥的前缀04
- 将上面移除04后的16进制字符串再次转化为字节数组
- 计算字节数组的Keccak-256哈希值(64位十六进制数)
- 取上一步结果取后40位即以太坊地址
- 由于ECDSA-secp256k1、Keccak-256都是数字签名算法(摘要算法),因此无法通过地址计算公钥,无法通过公钥计算私钥
- 私钥拥有对账户的控制权
助记词
- BIP协议,是Bitcoin Improvement Proposals的缩写,意思是Bitcoin的改进建议,不过有些提议也被以太坊采用
- BIP32
- 私钥的记忆和管理很麻烦,如果由多私钥需求,管理起来就更麻烦,因此出现了BIP32
- BIP32允许通过种子生成一系列私钥,这样只需要记住种子就相当于记住了一系列私钥
- BIP44
- BIP44对BIP32进行补充,完善了通过种子生成一系列私钥的算法
- BIP44通过路径(m/purpose'/coin'/account'/change/address_index)生成一系列私钥
- 以太坊钱包也遵循BIP44标准,确定路径是m/44'/60'/a'/0/n
- BIP39
- 种子是32位十六进制的字符串,记忆起来依然很困难
- BIP39可以将种子映射为12个单词,也就是助记词。单词大多使用英文单词,不过也支持汉字、日文等
- 记住助记词,就相当于记住种子,就相当于记住一系列私钥
- 如果通过助记词方式导入账户,默认使用一系列私钥中的第一个私钥,如果你继续创建账户,则会依次生成新私钥
- 助记词生成私钥的过程中采用了数字签名算法算法,因此无法从私钥推导出助记词,由此看来助记词的层次比私钥更高
- 种子生成助记词时,也可以使用助记词密码,默认不带密码
- 此时种子+助记词密码可以得到助记词。并且该过程可逆,即助记词+助记词密码可以推导出种子
- 在这种情况下,记住助记词和助记词密码才拥有相当于记住一系列私钥,即使助记词泄漏也不用担心账户失窃
Keystore
- Keystore常见于以太坊钱包,它是将私钥以加密的方式保存为一份JSON文件,这份JSON文件就是Keystore
- 所以Keystore就是加密后的私钥。Keystore必须配合钱包密码可以解密出私钥,拥有账户控制权
钱包密码
- 钱包用于管理助记词、私钥等,等级最高。
- 以MetaMask为例,创建账户时本质是生成助记词种子,由此可以生成你的助记词,未使用到助记词密码。
- 让你输入的密码是用来保护这个扩展程序的,与上文涉及的密码完全无关
- 利用助记词生成的第一个私钥就是你的账户,如果你点击继续创建,就会利用助记词生成后续的私钥
- 当然,MetaMask也支持直接导入私钥,不过也得先输入正确密码解密MetaMask