比特币中的地址

创建地址

在比特币交易中,当你需要接受比特币时,只需要把地址发生给对方即可。地址本身时一串包含数字字母的字符串,基本生成流程为:

通过安全的方式生成随机数以创建私钥->生成公钥->对公钥进行SHA256哈希运算->将运算结果进行RIPEMD160运算->将结果进行Base58Check编码

倒数第二步得到的就是比特币公钥地址,即

A = RIPEMD160(SHA256(K))

为了增加可读性,通常会对地址进行Base58Check编码。下面是摘自原版精通比特币中的工作流程图。

public key to bitcoin address

Base58编码是在Base64基础上剔除了下列字符:

  • 大写的O,I;小写的l
  • 数字 0
  • 符号 \,+,/

Base58Check编码是包含了Base58校验的编码,即字符串本身包含了校验码,这样可以方便快速的判断该字符串是否正确,最大程度的减少了拼写或写错的概率。它的规则是:

  1. 在需要编码的数据data前添加4字节的前缀,前缀内容取决于data的数据类型(见下表)
  2. 对前缀+数据data进行两次SHA256运算
  3. 取出2中运算结果的首4字节作为checksum,添加到数据data后面
  4. 前缀+数据data+checksum 作Base58编码

这样做的好处就在于:

  1. 快速的知道该地址类型
  2. 通过checksum可以快速确认该地址的正确性

Base58Check version prefix

其中,WIF: Wallet Import Format,适用于钱包的地址格式

密钥格式

私钥的格式

256位长度的私钥可以以下列形式展现:

private key presentation 私钥的不同格式

公钥格式

压缩和非压缩 非压缩的公钥匙:0x04XY,其中(X,Y)是椭圆曲线上的点,满足

Y^2 mod p = (X^3 + 7) mod p

椭圆加密曲线 从曲线的特征来看,

  1. 已知X,可以求出Y
  2. 一个X可以对应两个Y

可以看出,只用X再加上Y的正负就可以表达整个公钥,因此压缩公钥格式:

  • Ox02X: Y为偶
  • 0x03X: Y为奇

非压缩公钥520bit,压缩公钥264bit,可见省了不少空间。对于现在的钱包应用,都是使用压缩公钥格式生成比特币地址。
从压缩公钥和非压缩公钥分布得到的比特币地址必定是不一样的,但又都是合法有效的,那对于钱包应用如何来辨识当前用的哪种地址呢?解决方法是当私钥导出的时候,通过判断是WIF的格式形式来得知当前使用的是压缩还是非压缩的地址。如果使用的是WIF-compressed,就意味着比特币地址是使用压缩公钥生成的。WIF-compressed是由"压缩私钥"生成的,“压缩私钥”的构成: HEX_01_
可见,所谓的“压缩私钥”并没有真正的进行压缩,而是更多的和压缩/非压缩公钥寻求形式上的对称。