主页 > 下载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开头的字符串,这有点像整个过程如下:

compressed-addr

使用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算法根据私钥计算出来的。地址是公钥哈希的代码,而不是公钥本身。地址可以从公钥中推导出来。

地址不能推导出公钥,公钥不能推导出私钥。