比特币公钥从格式上讲分为压缩格式和非压缩格式,非压缩格式的公钥是由椭圆曲线的 X 轴和 Y 轴的值所组成的,我们知道公钥是由私钥推导出来的,公钥是一个椭圆曲线上的点,由 X 轴和 Y 轴的值组成,椭圆曲线是一个数学方程,曲线上的每个点是该方程的一个解。当我们得到公钥的 X 轴坐标后,就可以通过解方程得到 Y 轴坐标值,因此只需存储公钥 X 轴坐标的值就可以了,从而将公钥的大小减少了256比特。
私钥:
DDB22D25DA187BC962E3B48C4630021C0D1B08C34858921BC7C662B228ACB7BA
根据私钥推导出 X 轴的值:
E9505DDA410906BD2008C2E43D3A7C950AAD99798DEF4479AB74B43CC39C8A9B
根据 X 轴可以推导出 Y 轴的值:
FB844C325889737EDFDE068920562A854F858C78E94B8004B96B76CA62985C49
非压缩格式公钥由 X 轴和 Y 轴的值合并组成,并在开头添加前缀04:
04E9505DDA410906BD2008C2E43D3A7C950AAD99798DEF4479AB74B43CC39C8A9B FB844C325889737EDFDE068920562A854F858C78E94B8004B96B76CA62985C49
也许是中本聪当时疏忽或者对椭圆曲线没有那么精通,中本聪使用了由 X 轴和 Y 轴组成的完整公钥。由于交易的解锁脚本中包含公钥,相对于使用非压缩公钥,使用压缩公钥可以使每个区块包含更多的交易,也加快了交易的传播速度和交易速度。后来由于越来越多的人参与比特币的交易,比特币交易开始出现拥塞,于是人们对此进行了改进,增加了压缩公钥。为了区分压缩公钥和非压缩公钥,非压缩公钥以04开头,压缩公钥地址以02或03开头。
为什么压缩公钥会有两种不同的前缀呢?根据椭圆曲线方程对 Y 求解,得到的是一个平方根,平方根的值有正有负,如果我们不存储 Y 的坐标值,那么就需要把正负符号记录下来。当在素数 p 阶的有限域上进行二进制计算椭圆曲线时, Y 轴的值要么为偶数要么为奇数,正好对应于 Y 轴值的正负符号。因此,为了区分 Y 轴的值的正负,在生成压缩格式公钥时,如果 Y 轴值是偶数就添加02前缀,如果是奇数就添加03前缀。
压缩格式的公钥和非压缩格式的公钥生成的比特币地址是不同的,但不论哪种格式生成的比特币地址,它们所对应的私钥还是同一个。