作者:林轻武
发布时间:2018年1月8日
网络来源:知乎
业余比特币用户,请轻喷。
似乎社区已经开始推广“压缩地址”了,这里说下压缩与非压缩的区别。
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)处理得到我们常用的私钥:
转载者注:校验位是对加上版本号后的私钥进行两次sha256后,取前4个字节。
私钥前缀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位。
又因为这种算法是不可逆的,所以压缩和非压缩地址没有关系,不能互相推导。