1、压缩格式公钥
何为压缩,压缩就是让某一个文件占用的空间变小的。非压缩格式的公钥是一个520比特的数字,它是有04开头,后面
是256比特数字的xy坐标。如果使用压缩格式的公钥,就可以把公钥的占用的空间变小一点,这样,就可以节省那些运行的区
块链节点的空间。
如何压缩公钥?前面知道,公钥是一个点,是一个位于椭圆曲线上的点(x,y)。而椭圆曲线是一个数学方程,知道x
我们就可以通过y^2 mod p = (x^3+7) mod p求出y的值。这样的话,我们就只需要有x的值就行了,可以省去y值,这样的话,
就可以节省近一半的空间。
再就是,为何压缩格式分为02和03开头?我们知道椭圆曲线方程的左边是y^2,他的解是一个平方根,有两种情况,正值或者负值。省去了y值,但是必须知道y的正负,当我们在素p阶的有限域上使用二进制算术计算椭圆曲线的时候,y 坐标可能是奇数或者偶数,分别对应前面所讲的y值的正负符号。
所以,如果是偶数则使用02做前缀,如果是奇数则使用03做前缀。
2、压缩格式私钥
从上面知道,在椭圆曲线方程中,知道x便可以求出y值,由于这样便可以省区y值,以达到压缩公钥的目的,但是如何去压缩私钥呢?不可能省去x值吧?当然不可能。所以,在这里的压缩格式的私钥是一个错误的说法,也可以说是误导式的说法。
私钥是不能被压缩的。私钥非但没有被压缩,还比"以前的私钥"长了一个字节。而这个长的私钥被加了后缀01,用来区别该私钥是一个来自新钱包的。
新钱包?什么意思。公钥格式有压缩的,没有被压缩的。同一个私钥可以生成两种格式公钥(压缩格式的和非压缩格式),两个格式的公钥经过用双哈希函数(RIPEMD160(SHA256(K)))后,得到两个不同的地址,而这两个不同的比特币地址都是合法的且来自同一个私钥。
两种地址都能使用,但是并不是所有的客户端都支持压缩格式的。而支持压缩格式的钱包就称为新钱包。
新钱包使用那个地址?无论是压缩格式的地址或者非压缩格式的地址,都是合法的比特币地址,都可以被私钥签名。为解决这个问题,新钱包会对两种格式的公钥进行不同的处理方式,而这个时候的所谓的"压缩格式私钥"在后加上01后缀比那是用来区别这个私钥是来自新钱包,回生成压缩格式的公钥。
“压缩格式私钥”是一个不当用词!私钥不是压缩的。WIF压缩格式的私钥只是用来表明他们只能被生成压缩的公钥和对应的比特币地址。相反地, “WIF 压缩” 编码的私钥还多出一个字节,因为这种私钥多了后缀“01”。该后缀是用来区分“非压缩格式”私钥和“压缩格式”私钥。
相同的密钥,不同的格式
十六进制压缩私钥格式(hex-compressed)在末尾加了一个字节(十六进制为01)。 虽然 Base58 编码版本前缀对于 WIF和WIF压缩格式都是相同的(0x80),但在数字末尾添加一个字节会导致Base58编码的第一个字符从5变为K或L。
这些格式并不是可互换使用的。在实现了压缩格式公钥的较新的钱包中,私钥只能且永远被导出为WIF压缩格式(以K或L 为前缀)。对于较老的没有实现压缩格式公钥的钱包,私钥将只能被导出为WIF格式 (以5为前缀)导出。这样做的目的就是为了给导入这些私钥的钱包一个信号: 是否钱包必须搜索区块链寻找压缩或非压缩公钥和地址。
如果一个比特币钱包实现了压缩格式公钥,那么它将会在所有交易中使用该压格式缩公钥。钱包中的私钥将会被用来在曲线上生成公钥点,这个公钥点将会被压缩。压缩格式公钥然后被用来生成交易中使用的比特币地址。
当从一个实现了压缩格式公钥的新的比特币钱包导出私钥时,钱包导入格式(WIF)将会被修改为WIF压缩格式,该格式将会在私钥的后面附加一个字节大小的后缀01。最终的Base58Check编码格式的私钥被称作 WIF(“压缩”)私钥,以字母“K”或“L”开头。 而以“5”开头的是从较老的钱包中 以 WIF(非压缩)格式导出的私钥。