最新比特币价格-比特币今日行情价格_比特币交易网

比特币的公钥、地址及其相互关系解析

佚名

比特币bitcoin公钥_比特币公钥和私钥_比特币公钥和地址的区别

公钥机制与生成流程

比特币公钥是由私钥经过椭圆曲线数字签名算法(ECDSA)计算得出。私钥实质上是一个256位整数k,通过此算法可以衍生出一对256位整数(x, y),这两者构成了非压缩格式的公钥。

利用椭圆曲线特性,只需(x, y)中的x值,结合y的奇偶性信息,就能推导出压缩格式的公钥x'。压缩格式公钥仅保留x值,并在其前附加02或03前缀(y为偶数时加02,否则加03),形成长度为33字节的压缩公钥。

值得注意的是,尽管压缩与非压缩公钥之间可互换,但都无法逆向推导出原始私钥。目前,非压缩格式的公钥已较少使用,因其在签名脚本中占用更多空间。

示例代码:
const bitcoin = require('bitcoinjs-lib');
let wif = 'KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617';
let ecPair = bitcoin.ECPair.fromWIF(wif); // 导入私钥
let pubKey = ecPair.getPublicKeyBuffer(); // 输出压缩公钥Buffer对象
console.log(pubKey.toString('hex'));

地址生成与公钥的关系

比特币地址并非直接源自公钥,而是基于公钥的哈希值。因此,虽然可以从公钥导出地址,但无法通过地址反向还原公钥,因哈希函数具备不可逆性质。

对于压缩公钥,生成地址的过程包括:首先对33字节的公钥数据执行Hash160(即SHA256后跟RipeMD160)运算,得到20字节哈希值;接着,加上0x00前缀,构建出21字节数据;然后,为其计算出4字节校验码,最后整合成25字节的数据块。对该数据块进行Base58编码,便得到以1开头的比特币地址。

示例代码:
let publicKey = '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3D66a2c5f10780d95b7df42645c';
let ecPair = bitcoin.ECPair.fromPublicKeyBuffer(Buffer.from(publicKey, 'hex')); // 导入公钥
let address = ecPair.getAddress();
console.log(address); // 输出1开头的地址

不论是非压缩格式还是压缩格式的公钥进行哈希编码,生成的比特币地址均以1开头。这意味着从地址本身无法判断所使用的公钥格式。

比特币地址通常用于接收交易,可以安全地公开分享。仅仅提供地址不会泄露公钥信息。事实上,若某个地址已有资金,花费这笔资金则需提供相应的公钥。一旦某个地址的资金已被花费过至少一次,则其对应的公钥事实上已经被公开。

小编建议要点

- 比特币公钥依赖于私钥,通过ECDSA算法衍生而来,并存在压缩和非压缩两种表达形式。

- 地址实际源于公钥的哈希编码,并非公钥本身,故可通过公钥推导出地址,反之则不行。

- 从地址无法逆推出公钥,同样地,也无法通过公钥恢复私钥。