私钥 → P2PKH 非压缩地址
同一把私钥的另一个 1… 地址:这次哈希的是完整的 65 字节公钥 04‖X‖Y。这是 2012 年以前所有钱包使用的格式,今天依然合法、依然可以花费,也是大量老币真正所在的地址。
请在上方输入内容后点击「转换」。不知道填什么?点「填入示例」即可载入占位符里的演示数据。
本页计算了什么
输入与压缩版页面相同的私钥,但哈希的是 65 字节非压缩公钥
04 ‖ X ‖ Y。地址公式完全一样 —— 变的只是送入哈希的字节:
这两个地址外形相同、长度相同、版本字节相同,但绝不能互换。币只存在于某一个具体地址上, 只有用当初收款时那一串确切字节的哈希,才能认出它们。
1. 非压缩公钥:04 ‖ X ‖ Y
SEC1 标准定义了点在小曲线上的多种序列化方式。最早的那种把一切都写明白:一个 04 标志,然后
32 字节的 X 坐标,再然后 32 字节的 Y 坐标。没有任何压缩,也不需要重算 —— 验证方从数据里直接读出两个坐标。
| 形式 | 标志 | 内容 | 长度 | 使用者 |
|---|---|---|---|---|
| 非压缩 | 04 | X(32 字节)‖ Y(32 字节) | 65 字节 / 130 位 hex | 中本聪时代的客户端、本页 |
| 压缩,Y 为偶 | 02 | X(32 字节) | 33 字节 / 66 位 hex | 2012 年之后的一切 |
| 压缩,Y 为奇 | 03 | X(32 字节) | 33 字节 / 66 位 hex | 2012 年之后的一切 |
| x-only(BIP340) | — | X(32 字节) | 32 字节 / 64 位 hex | Taproot 输出公钥 |
两种形式描述的是同一条曲线上同一个点。压缩不是什么「另一把密钥」,不是另一条派生路径,更不是数学上 的「兼容模式」—— 它只是一种更短的写法,之所以可能,是因为 Y 可以从 X 加一个奇偶位完整恢复出来(推导见 压缩公钥页面)。
那 32 字节的标量就是一个数字。「压缩」是钱包如何序列化公钥的属性,除了记录在 WIF 字符串里
(5… = 非压缩,K…/L… = 压缩),就只存在于钱包自己的元数据中。
正是这一个事实,造就了下面所有「我的币不见了」的故事。
2. 哈希为什么不同 —— 地址为什么不同
hash160 是它所吃进的那串确切字节的函数,而不是它所代表的点的函数。65 字节输入与 33 字节输入的长度 不同、首字节不同,摘要自然完全不同。两个结果之间没有任何数学关系:它们是两个彼此独立的 160 位值。
| 步骤 | 压缩(C) | 非压缩(U) |
|---|---|---|
| 公钥 | 02ff812e…8c67ee80(33 字节) | 04ff812e…32b424ae(65 字节) |
| 它的 SHA-256 | 067eb00a0b9864633b020eef374476142daba913c5481ad6a4741cc8ab702617 | 30c812bb6ef97f95538e2423f944d056d0cefc28021113de143e56d2c9d11900 |
| hash160(20 字节) | 21f57b6debcfc5b67182dfb4af1641f0a8189012 | 3f0e966dc089c611a9c1d03bd4f69ea53b0223f9 |
| 带版本字节的载荷 | 0021f57b…12 | 003f0e96…f9 |
| 校验和(4 字节) | cbd7667e | 3b0b7cbd |
| P2PKH 地址 | 146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT | 16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G |
| 对应的 WIF | KwVYL77Lcs1ckM39NvGjrtfKhU4KKdR2iB9Wq2FSMN6rbGK5tVqG(K…) | 5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU(5…) |
两行都正确、都能花费、都属于同一个 256 位秘密。链上没有任何标记说明它们相关 —— 这正是它成为互操作陷阱而不是 冷知识的原因。
3. 历史时间线
非压缩不是「坏掉的遗留格式」,它是最初的格式。
| 时间 | 发生了什么 |
|---|---|
| 2009 年 1 月 | Bitcoin v0.1 发布。密钥按非压缩方式序列化;最早的币大多是 P2PK 输出,里面直接装着完整的 65 字节公钥。 |
| 2009 – 2011 | 所有钱包(包括参考客户端)都哈希 65 字节形式。这个时期几乎每一个地址都是非压缩 P2PKH 地址。 |
| 2012 年 3 月 | 参考客户端 0.6 系列加入压缩公钥支持:新生成的密钥使用 02/03,WIF 也开始出现 K…/L… 前缀。BIP16(P2SH)也在同一时期于 2012 年 4 月 1 日激活。 |
| 2013 – 2014 | HD 钱包(BIP32/BIP44)成为标准,并为每个派生地址默认使用压缩公钥。非压缩退化为仅供导出的格式。 |
| 2017 年 8 月 24 日 | SegWit 激活。witness 类地址强制要求压缩公钥,分裂从此定型。 |
| 今天 | 非压缩 P2PKH 依然合法、依然能被中继,也依然装着真实资产 —— 大多自 2009–2011 年起就未曾动过。 |
4. 钱包恢复:为什么老地址上的币,新钱包看不到
这正是本页存在的理由。你恢复了助记词,或导入了私钥,钱包却显示余额为零 —— 而区块浏览器明明显示有一笔币
安安静静躺在一个 1… 地址上,你确信那属于你。问题同时出在三处:
- 钱包只算一种序列化。 遵循 BIP44/BIP49/BIP84/BIP86 的现代钱包按约定派生压缩
公钥,哈希的是 33 字节形式,得到压缩的
hash160,然后去查146ZNjH7…。而币在16kR3eis…上 —— 那个值钱包根本不会算,自然也不会向网络查询它。 - 恢复了种子,不等于恢复了钱包。 种子确定性地产生私钥,但地址约定属于客户端软件, 不属于数学。同一个种子在 2009 年的客户端和 2024 年的客户端上,会得到两组完全不相交的地址。
- 决定一切的是 WIF 标志,不是私钥。 当密钥以
5HssbguBnjbaUVZCsH9YuzUG7T4vYQf51iiodi4izdVy6aVNekU(前缀5)导出时,钱包 应当按非压缩处理。如果你把它当成K…/L…导入,或把裸 hex 粘进一个默认压缩的 钱包,那么币会从视野中消失 —— 尽管它们一动没动。
为你手上的每一把密钥同时推导两个地址,并专门去查那个非压缩的。能做到这一点的工具:提供
「非压缩 / 遗留」导入选项的离线钱包、会扫描两种 hash160 形式的清空(sweep)工具,或者像本页
这样的页面配合离线浏览器核对。在你确认能用老私钥签名之前,不要草率地把老地址上的币「搬到」新地址 ——
控制源地址的仍是同一把私钥,签名本身没问题;真正的风险是你误以为钱没了,然后做出激进操作。
5. 非压缩形式在链上还有效吗
有效。共识规则没有任何一条禁止它,由非压缩公钥建立的 P2PKH 输出今天依然可以花费:
- 锁定脚本只承诺一个 20 字节哈希。解释器并不关心解锁脚本里给出的公钥是 33 还是 65 字节 ——
OP_HASH160只是对它拿到的字节求哈希,OP_EQUALVERIFY比较结果是否相等。 - 非压缩 P2PKH 的花费在中继策略下仍然是标准交易,因此会正常广播、正常被打包。
- 唯一的硬限制出现在 witness 程序内部:一个 v0 witness 花费若提交非压缩公钥,会触犯标准性
标志
SCRIPT_VERIFY_WITNESS_PUBKEYTYPE。这样的输出依然可以被构造出来(编码器会老老实实给你一个bc1q…或3…字符串),但它的花费无法通过正常中继广播 —— witness 类地址按策略 只能配压缩公钥。
非压缩 P2PKH 地址没有被弃用,也没有坏掉:它是一个普普通通、完全可花费的输出。要让这类输出无法花费, 必须做一次软分叉,而至今无人提出这样的方案,所以无论你什么时候去处理,币都还在那里。真正存在的只有现实层面的 期限 —— 密钥暴露在弱随机与钓鱼风险中的时间越长,攻击者的机会就越多。
把 hash160(非压缩公钥) 喂给 P2WPKH 或 P2SH-P2WPKH 编码器,会得到一个语法上完美无缺的地址,
但你可能无法通过正常中继花掉它,因为 witness 里必须携带 65 字节公钥。如果有工具提议把老密钥「升级」到
SegWit,它必须从同一标量推导出的压缩公钥出发 —— 对任何 witness 地址类型来说,非压缩的哈希就是
错误的 20 字节。
6. 经济账:脚本更大,手续费更高
花掉一个非压缩 P2PKH 输出更贵,因为解锁脚本必须多带 32 个字节:完整的 Y 坐标。两个地址在收款方看来毫无 区别,差异只在币移动时才显现。
| 项目 | 压缩 | 非压缩 |
|---|---|---|
| scriptSig 里的公钥 | 33 字节 + 1 字节压入前缀 = 34 字节 | 65 字节 + 1 字节压入前缀 = 66 字节 |
| 签名压入(典型) | 1 + 70…72 字节 + 1 字节 sighash ≈ 73 字节 | 同样 ≈ 73 字节 |
| scriptSig 合计 | ≈ 107 字节 | ≈ 139 字节 |
| 整个输入(txid + vout + 脚本 + sequence) | 32 + 4 + 1 + 107 + 4 = 148 字节 | 32 + 4 + 1 + 139 + 4 = 180 字节 |
| 每个输入多出的重量 | — | +32 字节 = +32 vB |
| 按 10 sat/vB 多付的手续费 | — | 每个输入 +320 sat |
按 10 sat/vB 计算,每笔输入大约多付 320 聪;若一次清空 50 个老输入,这就是约 16 000 聪的纯开销,而且手续费 一涨,差距还会拉大。这确实是真金白银的成本,但它也是搬走那些币的唯一方式:这笔费用不是可选项、也无法 规避,因为多出来的字节正是让哈希对得上的东西。
7. 主网与测试网的版本字节
| 网络 | P2PKH 版本 | P2PKH 前缀 | P2SH 版本 | WIF 版本 | Bech32 hrp |
|---|---|---|---|---|---|
| 主网 | 0x00 | 1… | 0x05 | 0x80 | bc |
| 测试网 | 0x6F | m… / n… | 0xC4 | 0xEF | tb |
对同一个 hash160,两条链之间唯一不同的就是版本字节:上面那个非压缩 hash160 在主网得到
16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G,在测试网得到
mmGNLhorkVyMfskQg8gKEgiRCAXAGnxeBv。版本字节也是主网地址以 1 开头的唯一原因 ——
Base58 会把每个前导 0x00 写成字面字符 1。
8. 用演示私钥做的实例演算
| 步骤 | 取值 |
|---|---|
| 私钥 k | 0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca |
| 非压缩公钥(65 字节) | 04ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee808f49cde13c7ffd64f1d730bf87a743a578eda4971ddac4a08118160732b424ae |
| 它的 SHA-256(32 字节) | 30c812bb6ef97f95538e2423f944d056d0cefc28021113de143e56d2c9d11900 |
| hash160(20 字节) | 3f0e966dc089c611a9c1d03bd4f69ea53b0223f9 |
载荷 = 00 ‖ hash160(21 字节) | 003f0e966dc089c611a9c1d03bd4f69ea53b0223f9 |
| 校验和(4 字节) | 3b0b7cbd |
| P2PKH 地址(非压缩) | 16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G |
| 同一私钥的压缩地址 | 146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT |
| 对应的 scriptPubKey(25 字节) | 76a9143f0e966dc089c611a9c1d03bd4f69ea53b0223f988ac |
表中每个值都由结果面板实时重算,你可以亲自确认那两个 hash160、进而两个地址,彼此毫无关系。
9. 这一步在推导链上的位置
- 姊妹页:压缩版 P2PKH 地址 —— 同一条流水线,把 65 字节换成 33 字节,也就是 现代钱包显示的地址。
- 上游:私钥 → 非压缩公钥 展示这 65 字节是怎么由点拼出来的。
- 导出格式:非压缩 WIF(
5…)正是钱包为了去查这个地址、而不是压缩 地址,所需要的东西。 - 只有本页的地址与老资金有关:嵌套 SegWit 与 原生 SegWit 只支持压缩公钥,永远匹配不上老密钥的非压缩哈希。
10. 安全须知
非压缩地址与早期高价值币高度绑定,而一些早期密钥是用弱随机数生成的(以时钟为种子的可预测随机数发生器,
或者干脆是手写的脑钱包)。一个挂在「富豪榜」上的非压缩地址会吸引大量暴力尝试。如果你掌握这类币,请把它们
转移 —— 但要转得正确:先用 5… WIF 清空非压缩地址,再整合到一个由可靠随机种子导出的
全新现代地址上。
- 两个地址都是公开信息;保密的只有私钥和两个 WIF。
- 签名之前先确认币到底在哪个地址上。不确定就先小额试转一笔。
- 不要把老私钥粘进任何「顺便帮你查余额」的网站 —— 那是最经典的钓鱼套路,而老密钥是极诱人的猎物。
11. 常见错误
- 以为一把私钥只对应一个地址。 一个标量至少给出五个可用地址(压缩
1…、非压缩1…、3…、bc1q…、bc1p…),外加它们的测试网变体。 - 导入了错误的 WIF 形式。
5…与K…/L…是同一个秘密 指向不同地址;搞混就会看到一个空钱包。 - 迷信钱包的「自动识别」。 有的客户端两种形式都扫,有的只扫一种,还有的会默默显示为零。 请拿派生出的地址去区块浏览器核对,而不是看余额。
- 以为压缩是「更新的数学」。 同一条曲线、同一个点,变的只是序列化。
- 用非压缩密钥的哈希去清空到 SegWit 地址。 收款地址应当由全新的压缩密钥构建;见上方的 危险提示。
12. 速查表
| 项目 | 取值 |
|---|---|
| 公式 | Base58Check(0x00 ‖ hash160(非压缩公钥)) |
| 哈希输入 | 65 字节公钥 04 ‖ X ‖ Y(130 位十六进制) |
| 哈希函数 | hash160 = RIPEMD160(SHA256(x)),20 字节 |
| 版本字节 | 主网 0x00,测试网 0x6F |
| 被编码的载荷 | 25 字节 = 1 + 20 + 4 |
| 花费时的 scriptSig | 约 139 字节(压缩约 107 字节) |
| 对应的 WIF | 5…(非压缩) |
| 兼容 SegWit 吗 | 不兼容 —— witness 程序按策略只接受压缩公钥 |
| 演示地址 | 16kR3eiswUY6tmGnxZhwQmW6LAvTLGWG2G |
| 还能花吗 | 能 —— 共识与中继策略都接受 |