在比特币交易中经常会听到私钥、公钥、钱包地址,它们三者直接到底有什么联系呢?
生成流程
- 1.首先使用随机数发生器生成一个私钥,一般是256位。
- 2.私钥经过SECP256K1算法生成公钥,65个字节。SECP256K1是一种椭圆曲线算法,是不可逆的,所以公钥是不可以反推出私钥。
- 3.同SHA256一样,RIPEMD160也是一种Hash算法,通过公钥计算得出公钥哈希,20个字节。
- 4.将一个字节的地址版本号连接到公钥哈希头部(对于比特币网络的pubkey地址,这一字节为“0”),然后对齐进行两次SHA256运算,将结果的前4字节作为公钥哈希的校验值(后续可以通过逆运算验证地址是不是错了),连接在其尾部。
- 5.将上一步结果(地址版本号+公钥哈希+校验值)进行base58进行编码,得到钱包地址,58个字节。
三者间关系
生成地址例子
- 1.随机数产生私钥
18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725 - 2.通过椭圆曲线算法产生公钥
0450863AD64A87AE8A2FE8….82BA6 - 3.对公钥进行SHA256计算
600FFE422B4E00731A59557A5CCA46CC183944191006324A447BDB2D98D4B408 - 4.对第三步结果进行RIPEMD160运算
010966776006953D5567439E5E39F86A0D273BEE - 5.对第四步结果加上版本号
00010966776006953D5567439E5E39F86A0D273BEE - 6.对第五步进行SHA256运算
445C7A8007A93D8733188288BB320A8FE2DEBD2AE1B47F0F50BC10BAE845C094 - 7 对第六步进行SHA256运算
D61967F63C7DD183914A4AE452C9F6AD5D462CE3D277798075B107615C1A8A30 - 8.提出第七步结果的前4个字节
D61967F6 - 9.将第八步的4个字节放在第五步结果的尾部
00010966776006953D5567439E5E39F86A0D273BEED61967F6 - 10.对第九步结果进行base58编码
16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM
为什么说不会输错比特币地址
因为钱包一般对地址进行逆运算,得出第九步的结果,然后去掉最后4个字节,然后进行两次SHA256得出结果的前4个字节,然后与校验值比较,称为checksum检查。
为什么最后生成地址要使用base58而不是base64
base64包含52个大小写英文字母,0-9的10个数字,\和+。
因为base58去除了容易产生歧义的字符:
- 大写的i(I),大写的O
- 小写的L(l)
- 数字0
- 影响双击选择的/和+