创建地址
在比特币交易中,当你需要接受比特币时,只需要把地址发生给对方即可。地址本身时一串包含数字字母的字符串,基本生成流程为:
通过安全的方式生成随机数以创建私钥->生成公钥->对公钥进行SHA256哈希运算->将运算结果进行RIPEMD160运算->将结果进行Base58Check编码
倒数第二步得到的就是比特币公钥地址,即
A = RIPEMD160(SHA256(K))
为了增加可读性,通常会对地址进行Base58Check编码。下面是摘自原版精通比特币中的工作流程图。
Base58编码是在Base64基础上剔除了下列字符:
- 大写的O,I;小写的l
- 数字 0
- 符号 \,+,/
Base58Check编码是包含了Base58校验的编码,即字符串本身包含了校验码,这样可以方便快速的判断该字符串是否正确,最大程度的减少了拼写或写错的概率。它的规则是:
- 在需要编码的数据data前添加4字节的前缀,前缀内容取决于data的数据类型(见下表)
- 对前缀+数据data进行两次SHA256运算
- 取出2中运算结果的首4字节作为checksum,添加到数据data后面
- 对
前缀+数据data+checksum
作Base58编码
这样做的好处就在于:
- 快速的知道该地址类型
- 通过checksum可以快速确认该地址的正确性
其中,WIF: Wallet Import Format,适用于钱包的地址格式
密钥格式
私钥的格式
256位长度的私钥可以以下列形式展现:
公钥格式
压缩和非压缩
非压缩的公钥匙:0x04XY
,其中(X,Y)是椭圆曲线上的点,满足
Y^2 mod p = (X^3 + 7) mod p
从曲线的特征来看,
- 已知X,可以求出Y
- 一个X可以对应两个Y
可以看出,只用X再加上Y的正负就可以表达整个公钥,因此压缩公钥格式:
- Ox02X: Y为偶
- 0x03X: Y为奇
非压缩公钥520bit,压缩公钥264bit,可见省了不少空间。对于现在的钱包应用,都是使用压缩公钥格式生成比特币地址。
从压缩公钥和非压缩公钥分布得到的比特币地址必定是不一样的,但又都是合法有效的,那对于钱包应用如何来辨识当前用的哪种地址呢?解决方法是当私钥导出的时候,通过判断是WIF的格式形式来得知当前使用的是压缩还是非压缩的地址。如果使用的是WIF-compressed,就意味着比特币地址是使用压缩公钥生成的。WIF-compressed是由”压缩私钥”生成的,“压缩私钥”的构成: HEX_01_
。
可见,所谓的“压缩私钥”并没有真正的进行压缩,而是更多的和压缩/非压缩公钥寻求形式上的对称。
Comments