地址,钱包,keystore
地址
地址
通常被用于标识在当前主流区块链上的一个唯一账号,我们先看看地址是如何生成的,一般地址是通过:Address=Hash(pubkey)[12:]
方式生成,当然生成方式不是唯一的,这里说的是当前主流的比特币和以太坊的地址生成方式,理解一下就是将公钥进行哈希(btc是两次哈希)生成一个不可逆的数据摘要,由于该数据摘要比较大(32字节),所以就取其中的后20个字节作为地址,最后这20个字节的地址再做一个编码(base58等)转成用户常见的地址。
func PubkeyToAddress(p ecdsa.PublicKey) common.Address {
pubBytes := FromECDSAPub(&p)
return common.BytesToAddress(Keccak256(pubBytes[1:])[12:])
}
由于每对公私钥对(上节介绍)都是唯一的,即每个私钥有且只有一个公钥,那么由公钥生成的地址也是唯一的。
钱包/keystore
这里keystore是指以太坊节点中管理账户地址的一个组件,用于节点安全的管理及访问地址信息,看上去类似JSON格式的字符串,以文件形式存储。一个keystore文件包含了一个地址相关信息及地址对应私钥信息(当然不能是私钥的明文信息,私钥加密后的密文),也就是说每次访问keystore文件都需要用户输入密码,以解密keystore中的私钥信息。
钱包的概念类似于keystore,是对一组keystore的管理,提供了更加友好的对账户地址的管理方式及一些地址相关的一些历史信息的管理(历史交易,余额等)。
助记词
助记词
顾名思义就是用来辅助记忆私钥的,私钥是32个字节数字,如:0xa8d264b13e6c7949fc31c0c7555fe10849d0f3f05af0a1ffeb8239f68b2fe7e1
,不利于记忆,如果是以单词的形式记忆起来就好很多了。助记词一般由12/24个单词构成,2个单词之间由1个空格隔开,这些单词都来源于一个固定词库,是由私钥根据一定算法得来,所以助记词是私钥的另一种表现形式。
根据BIP39规范提出了一种计算私钥的方式,首先选择2048(0x800)个常用单词组成一个数组,私钥种子可以是128位或256位,再将私钥种子进行哈希h = hash256(seed)
,并将哈希结果的前几位(0101或00101100
)放入私钥(128/256位)后,总位数为11的整数倍。
每000 0010 0001
(11位)组成的一个十进制数,对应之前2048个单词的数组中的一个数组下标,11位二进制(0x7FF)组成的数,0~2048,每一个对应一个单词,所有的私钥的位数组成一组单词即为助记词。
最后将私钥,助记词,地址,keystore扩展类比一下:
地址=银行卡号
密码=银行卡密码
私钥=银行卡号+银行卡密码
助记词=银行卡号+银行卡密码
Keystore+密码=银行卡号+银行卡密码
Keystore ≠ 银行卡号