彻底搞懂公钥与地址:比特币交易背后的密钥关系链

·

关键词:比特币、公钥、地址、私钥、ECDSA、哈希、压缩格式、非压缩格式

在学习数字货币或准备开发区块链应用时,“公钥”“地址”常被混为一谈。事实上,它们属于一条逐级加密、不可逆向推导的链条:私钥→公钥→地址。本文将通过算法流程、代码示例与常见问题拆解,帮助你在 10 分钟内建立清晰的技术认知,并且能在真实环境中安全生成或解析比特币地址。


公钥是如何由私钥计算得来的?

私钥:256 位整数的起点

比特币的私钥本质上是一个由加密随机数生成的 256 位整数。只要拥有这串数字,就拥有对相应资金 100% 的控制权。为便于人类读写,通常采用 WIF(钱包导入格式)编码,如:

KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617

ECDSA 椭圆曲线算法

比特币选用 secp256k1 椭圆曲线。对私钥 k 做一次椭圆曲线乘法,即可得到曲线上的一个坐标点 (x, y)。这组坐标即为 非压缩公钥,长度为 65 字节(前缀 04 + 32 字节 x + 32 字节 y)。

提示:非压缩格式已逐渐被压缩格式取代,因为前者会让交易体积变大,从而推高矿工费。

压缩公钥:节省空间的精髓

由于 ECC 曲线的对称性,只要知道 x,就能计算出 y 的模平方根,剩下的只需标记 y 的奇偶性即可。因此在压缩公钥里:

最终得到 33 字节 的压缩公钥,前带 0203 标识。

JavaScript 演示:私钥 → 公钥

const bitcoin = require('bitcoinjs-lib');
const wif = 'KwdMAjGmerYanjeui5SHS7JkmpZvVipYvB2LJGU1ZxJwYvP98617';
const keyPair = bitcoin.ECPair.fromWIF(wif);

console.log(keyPair.getPublicKeyBuffer().toString('hex'));
// 输出示例:02d0de...(压缩公钥)

地址 ≠ 公钥:一步哈希保安全

为什么用哈希?

哈希函数具备 单向性,让任何人都能从公钥轻松获得地址,却无法反向解密出公钥。此外,错误检测(校验码)机制还能防止输错地址造成资产丢失。

地址生成 5 步走

  1. 对压缩公钥做 SHA256
  2. 再对结果做 RIPEMD160,最终得到 20 字节 Hash160
  3. 在 20 字节前添加网络字节 0x00,得到 21 字节数据。
  4. 对这 21 字节做两次 SHA256,取前 4 字节作为校验码。
  5. 把校验码追加到 21 字节后,共 25 字节,再进行 Base58Check 编码
    输出的字符串始终以 “1” 开头,这就是比特币地址。

JavaScript 演示:公钥 → 地址

const publicKey = '02d0de0aaeaefad02b8bdc8a01a1b8b11c696bd3d66a2c5f10780d95b7df42645c';
const pubKeyBuffer = Buffer.from(publicKey, 'hex');
const { address } = bitcoin.payments.p2pkh({ pubkey: pubKeyBuffer });
console.log(address); // 1开头的地址

👉 想知道这段代码跑通后得到的真实地址长什么样?一键体验完整流程。


图示:私钥、公钥、地址的关系链

私钥 (256 位整数)
   ↓ 椭圆曲线乘法 (secp256k1)
公钥 (压缩或非压缩 33/65 字节)
   ↓ Hash160 + Base58Check
地址 (以 1 开头的字符串)
注意:这是一个单向箭头。拥有地址无法反推公钥;拥有公钥无法反推私钥。

常见问题与解答(FAQ)

  1. Q:我可以随意公开自己的公钥吗?
    A:可以。公开公钥并不会泄露私钥,也无须担心资金被盗。真正需要保密的是私钥。
  2. Q:为什么有些地址以 3 开头,有些以 bc1 开头?
    A:地址前缀取决于“脚本类型”。“1” 开头的是传统 P2PKH 地址; “3” 开头是 P2SH(多重签名/脚本哈希); “bc1” 开头是 Bech32(隔离见证地址),可进一步降低手续费。
  3. Q:压缩格式与非压缩格式的地址能互相兼容吗?
    A:可以正常收款。因为哈希操作会抹平格式差异,生成的地址均以 “1” 开头。但从交易验证角度看,矿工更偏好压缩格式,以节省区块空间。
  4. Q:为什么地址里总带有大小写混合?
    A:Base58Check 编码剔除了容易混淆的字符(0/O、I/l),并加入校验码,大小写混排可提高肉眼辨识度,降低手动输入错误概率。
  5. Q:我能否通过一个地址推断出余额?
    A:在比特币公开账本上,可查询该地址的历任交易输出,进而推算余额;但这并不会暴露私钥或公钥,除非该地址之前已有 用过输出脚本 的情况,此时公钥就已被公开。
  6. Q:Fabric 或以太坊的地址生成流程一样吗?
    A:原理类似,均是私钥→公钥→哈希→编码,但椭圆曲线、哈希函数或编码方式可能存在差异。👉 点击深入了解不同链的地址差异

实战小结

牢记一句话:“把私钥当银行保险箱钥匙,把地址当银行卡号。” 任何公开信息都不会威胁你的资产,只要私钥未曾泄露。