Bitcoin的公钥是根据私钥计算出来的。
私钥本质上是一个256位整数,记作k
。根据bitcoin采用的ECDSA算法,可以推导出两个256位整数,记作(x, y)
,这两个256位整数即为非压缩格式的公钥。
由于ECC曲线的特点,根据非压缩格式的公钥(x, y)
的x
实际上也可推算出y
,但需要知道y
的奇偶性,因此,可以根据(x, y)
推算出x'
,作为压缩格式的公钥。
压缩格式的公钥实际上只保存x
这一个256位整数,但需要根据y
的奇偶性在x
前面添加02
或03
前缀,y
为偶数时添加02
,否则添加03
,这样,得到一个1+32=33字节的压缩格式的公钥数据,记作x'
。
注意压缩格式的公钥和非压缩格式的公钥是可以互相转换的,但均不可反向推导出私钥。
非压缩格式的公钥目前已很少使用,原因是非压缩格式的公钥签名脚本数据会更长。
根据私钥推算出公钥:
const bitcoin = require('bitcoinjs-lib');
let keyWif = 'KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617';
const