比特币(地址、私钥)压缩与非压缩的区别

业余比特币用户,请轻喷。


似乎社区已经开始推广“压缩地址”了,这里说下压缩与非压缩的区别。

15aeAiNmHqqHJLJqaSEwMwdft4uMxJZ4Mb    压缩地址
189Sirx5GdVZrkPXSBSrtz1j8yvxJ26L2d    非压缩地址

——哪儿压缩了??

别急,私钥长这样(称为WIF,钱包Wallet导入Import格式Format,常用的格式)

L52LeAjvxeDgPeN2p4ouku7pHLrnbZCX6SH6F5wuqdC1AftywpWR    压缩私钥
5KaqQNh5yZSyxRn6Pu4qCkypsNie4kYcNAohA5kFh1x4DGUQVV8     非压缩私钥

确定没搞错。


它们之间有什么关系?

  • 同一个私钥压缩前后在数值上相等,写法不同,可以互相转换。
  • 压缩私钥对应的地址与非压缩私钥对应的地址没有关系,不能相互推导。


对我们有什么影响:

  • 压缩地址和非压缩地址在使用上没有任何区别。
  • 压缩私钥在上古版本的软件中可能不被支持,在新版软件上没有区别。
  • 非压缩私钥的WIF格式是51位的Base58Check,数字5开头。
  • 压缩私钥的WIF格式是52位的Base58Check,字母K或L开头。


在程序眼中,压缩私钥只对应压缩地址,非压缩私钥只对应非压缩地址,即使两个私钥数值相等,也绝不兼容,一个私钥只能得到一个地址,拒绝任何形式的混淆。

所以没什么影响,只不过你看见的WIF格式私钥可能长得和原来不太一样。


到底哪儿压缩了?!

公钥。
下面是两个等价的公钥:

(为了方便观察,我用回车给它们加过换行,实际不换行)

非压缩公钥(130位十六进制 2+64+64)

04
1DC1A701EBB8EF3FC55093E25D78DCB56D21F11DD88D62714549A38539978D9D
8C953064030B72C6D468DE2676ACB46197297124FBA4F58A3ADBFF93F8D58376

压缩公钥(66位十六进制 2+64)

02
1DC1A701EBB8EF3FC55093E25D78DCB56D21F11DD88D62714549A38539978D9D
  • 非压缩公钥是04开头
  • 压缩公钥是02或03开头。

注意它们的第二行内容完全一样。

为什么要这么折腾?

常规交易的输入包含支付者的公钥,每一个压缩公钥比非压缩公钥节约一点点空间,现在区块容量已经塞满了,节约一点是一点啊。
这是理由之一吧。

为什么压缩私钥比非压缩私钥还长?

这两种私钥本质上是等价的, 解开base58和校验位,它们的实际内容都是

64位十六进制

e8d96a53e9c597e5a1e2ceaddd0b5ebe75588b26e71846b46a9b5f3666409355

如果是压缩私钥,追加后缀01。

之后经过Base58 +校验(Base58Check)处理得到我们常用的私钥:

私钥前缀80+私钥本体+后缀(压缩私钥后缀01,非压缩私钥无后缀)+校验

(为了方便观察,我用回车给它们加过换行,实际不换行)

压缩私钥 (76位十六进制 2+64+2+8) <=>(52位Base58)

80
e8d96a53e9c597e5a1e2ceaddd0b5ebe75588b26e71846b46a9b5f3666409355
01
dd183916

L52LeAjvxeDgPeN2p4ouku7pHLrnbZCX6SH6F5wuqdC1AftywpWR


非压缩私钥 (74位十六进制 2+64+8) <=>(51位Base58)

80
e8d96a53e9c597e5a1e2ceaddd0b5ebe75588b26e71846b46a9b5f3666409355
f4b0f677

5KaqQNh5yZSyxRn6Pu4qCkypsNie4kYcNAohA5kFh1x4DGUQVV8

压缩私钥是后来者,为防止与旧版混淆而区别表示。

为什么压缩地址和非压缩地址一样长?

因为用公钥推出地址的公式是RIPEMD160(SHA256(x)),无论公钥多长,最终结果都是160位二进制,也就是所谓的hash160,Base58+校验后26~34位。

又因为这种算法是不可逆的,所以压缩和非压缩地址没有关系,不能互相推导。

编辑于 2018-01-08