主页 > 下载imtoken钱包官网苹果版 > 如果你看完有收获,可以邀请作者在支付宝上喝咖啡
如果你看完有收获,可以邀请作者在支付宝上喝咖啡
公钥
比特币的公钥是根据私钥计算出来的。
私钥本质上是一个 256 位整数,用 k 表示。根据比特币采用的ECDSA算法,可以推导出两个256位整数,记为(x,y),这两个256位整数就是未压缩格式的公钥。
由于ECC曲线的特性,y实际上可以从未压缩格式的公钥(x,y)的x中计算出来,但是需要知道y的奇偶性。因此,可以根据 (x, y) y) 计算出 x' 作为压缩格式的公钥。
压缩格式的公钥实际上只存储了一个256位整数x,但是需要根据y的奇偶性在x前面加02或03前缀,y为偶数时加02,否则加03,这样就得到了一个1+32=33字节的压缩格式的公钥数据,记为x'。
注意btc地址格式,压缩格式的公钥和非压缩格式的公钥可以相互转换,但私钥不能逆推。
目前很少使用未压缩格式的公钥,因为未压缩格式的公钥签名脚本数据会更长。
让我们看看如何从私钥计算出公钥:
const bitcoin = require('bitcoinjs-lib');
----
let
wif = 'KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617',
ecPair = bitcoin.ECPair.fromWIF(wif); // 导入私钥
// 计算公钥:
let pubKey = ecPair.getPublicKeyBuffer(); // 返回Buffer对象
console.log(pubKey.toString('hex')); // 02或03开头的压缩公钥
构造ECPair对象后,可以使用getPublicKeyBuffer()将公钥数据作为Buffer对象返回。
地址
需要注意的是,比特币的地址不是公钥,而是公钥的哈希值,即可以从公钥推导出地址,但不能从地址反演。推送公钥,因为哈希函数是单向函数。
以压缩格式的公钥为例,从公钥计算地址的方法是先对1+32=33字节的公钥数据进行Hash160(即先计算SHA256,再然后计算RipeMD160),得到一个20字节的hash。然后,加上0x00前缀,得到1+20=21字节的数据,再计算4字节的校验码,把它们放在一起,得到总和1+20+4= 25 字节数据:
0x00 hash160 check
┌─┬──────────────────────┬─────┐
│1│ 20 │ 4 │
└─┴──────────────────────┴─────┘
Base58对上面25字节的数据进行编码,得到一个始终以1开头的字符串,这有点像整个过程如下:
使用JavaScript实现公钥到地址的编码如下:
const bitcoin = require('bitcoinjs-lib');
----
let
publicKey = '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c',
ecPair = bitcoin.ECPair.fromPublicKeyBuffer(Buffer.from(publicKey, 'hex')); // 导入公钥
// 计算地址:
let address = ecPair.getAddress();
console.log(address); // 1开头的地址
计算地址时,不需要知道私钥,可以直接从公钥计算地址btc地址格式,即通过ECPair.fromPublicKeyBuffer构造一个没有私钥的ECPair来计算地址。
需要注意的是,未压缩格式的公钥和压缩格式的公钥哈希得到的地址都以1开头,因此无法区分是使用压缩格式还是未压缩格式从地址本身。公钥。
以1开头的地址字符串是比特币支付地址,可以安全地透露给任何人。
只提供地址并不会让其他人知道公钥。一般来说,公开公钥不存在安全风险。事实上,如果一个地址有相应的资金,要花费这些资金,你需要提供公钥。如果一个地址的资金至少被使用过一次,则该地址的公钥实际上是公开的。
私钥、公钥和地址的推导关系如下:
┌───────────┐ ┌───────────┐
│Private Key│─────▶│Public Key │
└───────────┘ └───────────┘
▲ │
│ │
▼ ▼
┌───────────┐ ┌───────────┐
│ WIF │ │ Address │
└───────────┘ └───────────┘
总结
比特币的公钥是通过ECDSA算法根据私钥计算出来的。地址是公钥哈希的代码,而不是公钥本身。地址可以从公钥中推导出来。
地址不能推导出公钥,公钥不能推导出私钥。