Private Key Tools

私钥 → P2SH-P2WPKH 地址(嵌套 SegWit)

3… 嵌套 SegWit 地址:先哈希压缩公钥,把那 20 字节包成 0x0014‖程序,再对这 22 字节脚本求一次哈希,最后用版本字节 0x05 做 Base58Check。一共六层,全部展示。

只能使用由它推导出的压缩公钥:witness 程序必须是 33 字节公钥的哈希。允许 0x 前缀、空格与大写字母;数值必须落在 [1, n−1] 区间内。
还没有输入

请在上方输入内容后点击「转换」。不知道填什么?点「填入示例」即可载入占位符里的演示数据。

技术原理详解

本页计算了什么

这是嵌套 SegWit(nested SegWit)地址:把 SegWit 的锁定逻辑藏进一层 P2SH 外壳里,从而得到 一个看起来平平无奇的 3… 地址。它一共有六层,本页把每一层都打印出来:

address = Base58Check( 0x05 ‖ hash160( 0x0014 ‖ hash160(压缩公钥) ) )
私钥 k→ 33 字节压缩公钥→ hash160 = witness 程序→ 0x0014 ‖ 程序 = redeem script→ hash160(redeem script) = 脚本哈希→ 0x05 ‖ 脚本哈希 ‖ 校验和→ 3… 地址

由于内层值被哈希了两次 —— 一次作为公钥,一次作为 redeem script —— 这类地址恰好夹在传统 P2PKH 与原生 SegWit 之间,位置有些尴尬。文末的对比表会把这份代价量化出来。

1. P2SH:支付给脚本哈希

P2SH 由 BIP16 引入,于 2012 年 4 月 1 日激活。在它之前,发送方必须把收款方的完整花费条件 写进输出里:比如一个多重签名地址,就意味着要把整段 2 <公钥> <公钥> <公钥> 3 OP_CHECKMULTISIG 程序 —— 几百字节 —— 塞进交易,并且 为它付费。

P2SH 把这件事倒了过来:输出只承诺一个脚本的哈希,脚本本身要等到花费时才公开:

P2SH 的 scriptPubKey:   OP_HASH160  <20 字节脚本哈希>  OP_EQUAL
花费者稍后提供:          <……完整的 redeem script……>

让它安全成立的规则才是重点所在:

传统的「支付给脚本」P2SH
条件写在哪里完整写在发送方的输出里只写哈希;脚本到花费时才出现
3-of-3 多签的 scriptPubKey 大小约 105 字节永远 23 字节
那段大脚本由谁付费发送方(收款时就付)花费方(花钱时才付)
主网地址前缀—3…(版本字节 0x05)
「最后一次压入是 witness 程序」规则

BIP141 在 P2SH 之上追加了一条共识规则:当一笔 P2SH 花费的解锁脚本恰好只包含一次压入操作,而压入的字节看起来 像一个合法的 witness 程序(一个版本字节加 2–40 字节程序)时,这段脚本不会按传统方式执行,而是改为用 该交易的 witness 去对照这个程序做验证。正是这一条规则让嵌套 SegWit 成为可能 —— 同样一个 3… 形式的输出,既可以承载传统 redeem script,也可以承载 witness 程序。

2. SegWit 改变了什么

SegWit(隔离见证,BIP141,2017 年 8 月 24 日激活)把签名数据 —— 也就是 witness —— 移出了计算交易 ID 的结构,并给它一种更便宜的计量单位:

SegWit 之前SegWit 之后
签名位于输入的 scriptSig 里,而它参与 txid 哈希签名位于独立的 witness 字段,不参与 txid
任何第三方都能改动签名的编码方式从而改变 txid(可塑性)确认前 txid 就稳定 —— 这是闪电网络的前提
只有一种计量:1 字节 = 1 字节区块空间两种计量:普通字节 4 个重量单位,witness 字节 1 个
1 MB 区块上限4 000 000 重量上限 ≈ 可容纳约 4 倍的交易
脚本哈希放在 scriptSig 里witness 程序放在 scriptPubKey 里:OP_0 <20 或 32 字节>

体积计量是你能在手续费上直接感受到的那部分。重量以重量单位(WU)计,有效体积以虚拟字节(vB)计:

weight = 4 × 普通字节数 + 1 × witness 字节数   ·   vB = weight ÷ 4

因此每个 witness 字节的成本只有基础层字节的四分之一,这正是 SegWit 输入更便宜的原因。原生 P2WPKH 的输出就是 OP_0 <20 字节 hash160> —— 22 字节,没有 OP_DUP、没有 OP_CHECKSIG, 除了「witness 必须满足这个程序」之外没有任何要执行的东西。

SegWit 是软分叉,而 witness 规则更严格

旧节点仍然会把 witness 输出看作「谁都能花」,并且会乐意接受一笔完全忽略 witness 的交易。witness 规则只由升级 过的节点执行,所以 SegWit 花费要按一套更严格的标志集合来判定:例如非压缩公钥就不允许出现在 witness 程序里 (见「常见错误」一节)。

3. 嵌套 SegWit 到底为什么存在

SegWit 的原生地址格式是 bech32:bc1q…。在 2017 年,那是一种老钱包、交易所和支付处理商根本不认识的 新字符串格式 —— 许多系统会直接判为非法,有些干脆拒绝向它转账。

嵌套 SegWit(3…)解决的是部署问题,而不是密码学问题:

嵌套 SegWit 是桥梁,不是终点

它让整个生态可以渐进式采纳 SegWit:收款方先升级,发送方什么时候跟上都行。今天仍在维护的钱包普遍支持 bech32,新钱包默认使用 bc1q…;嵌套 SegWit 主要还留在 2017–2019 年恢复出来的钱包,以及过渡期 采用了它的服务里。

4. 逐字节看 redeem script

这段 redeem script 是单密钥场景下最小的合法 witness 程序 —— 22 字节,无一多余:

偏移长度字节含义
01 字节0x00OP_0 —— 压入一个空数组,同时充当 witness 版本 0
11 字节0x14压入接下来的 0x14 = 20 字节
2 – 2120 字节21f57b6d…9012witness 程序本体:压缩公钥的 hash160
—共 22 字节001421f57b6debcfc5b67182dfb4af1641f0a8189012这就是被哈希成 P2SH 脚本哈希的东西

有两个细节值得注意。第一,版本字节是 OP_0,并不是一个单独的「版本字段」—— witness 版本是用一个小的 脚本数字编码的,这也正是 v1(Taproot)以 OP_1(0x51)开头、并改用 bech32m 的原因。 第二,这 22 字节的字符串与原生 P2WPKH 的 scriptPubKey 完全相同:同一个程序被两种方式使用,一次直接放进 输出,一次包在 P2SH 哈希里面。

redeem script(22 字节)        = 00 14 21f57b6d…9012
P2SH 的 scriptPubKey(23 字节) = a9 14 823333d5…8b6e 87
                                  │  │  └─ 20 字节 hash160(redeem script)
                                  │  └──── 压入 20 字节
                                  └─────── OP_HASH160 … OP_EQUAL(87)

5. 双重哈希,以及它的代价

原生 P2WPKH 的链条是:对公钥哈希一次,把 20 字节做 bech32 编码。嵌套地址的链条则是:对公钥哈希一次,拼出 22 字节脚本,再哈希一次,然后把第二个哈希做 Base58Check 编码。两次哈希、两份不同输入,得到两个彼此无关的 20 字节值 —— 而地址携带的是第二个。

层输入输出演示取值
哈希 133 字节压缩公钥20 字节 witness 程序21f57b6debcfc5b67182dfb4af1641f0a8189012
脚本0x0014 ‖ 程序22 字节 redeem script001421f57b6debcfc5b67182dfb4af1641f0a8189012
哈希 2那 22 字节 redeem script20 字节脚本哈希823333d5fd23a83661e8e47629552c4a5bfc8b6e
编码0x05 ‖ 脚本哈希 ‖ 校验和25 字节 → Base58Check3DZT76KyKyc5zkzvLugP8umgt4RPY4XPQw

花费时,scriptSig 必须携带这 22 字节脚本(1 字节压入操作码 + 22 字节 = 23 字节),网络才能对它求哈希、看到 witness 程序。这 23 字节落在交易的基础部分,每字节要付 4 个重量单位,这也正是嵌套 SegWit 不如原生便宜的 全部原因:

P2SH-P2WPKH 输入 = 41 字节基础 + 23 字节 scriptSig → weight 4×64 + 108 = 364 WU = 91 vB
输入类型基础字节scriptSigwitness 字节重量(WU)体积(vB)按 10 sat/vB 的手续费
P2PKH(传统)36 + 1 + 4 = 4110705921481480 sat
P2SH-P2WPKH(本页)36 + 1 + 4 = 412310836491910 sat
P2WPKH(原生)36 + 1 + 4 = 41010827268680 sat

所以嵌套 SegWit 相比传统 P2PKH 省下约 57 vB(38%),但仍比原生 bech32 多付 23 vB(25%)。输出侧两种 SegWit 都 更小,因为 scriptPubKey 更短:P2SH 输出 32 字节、P2WPKH 输出 31 字节、P2PKH 输出 34 字节。

6. 对比表

P2PKHP2SH-P2WPKHP2WPKH
主网地址1…3…bc1q…
版本字节 / 格式0x00,Base58Check0x05,Base58Checkwitness v0,bech32
地址长度34 字符34 字符42 字符
scriptPubKeyOP_DUP OP_HASH160 <h> OP_EQUALVERIFY OP_CHECKSIGOP_HASH160 <h'> OP_EQUALOP_0 <h>
scriptPubKey 大小25 字节23 字节22 字节
地址承诺的是hash160(公钥)hash160(0x0014 ‖ hash160(公钥))hash160(公钥)
花费时的 scriptSig签名 + 公钥(约 107 字节)压入 22 字节 redeem script(23 字节)空
抗可塑性否是是
输入体积148 vB91 vB68 vB
发送方需不需要懂 bech32不需要不需要需要
典型时期2009 – 至今2017 – 2019 过渡期2017 – 至今

7. 用演示私钥做的实例演算

步骤取值
私钥 k0824c314772b2c2859c889471390a36bf66e53a1ca1642f96f0f2c9307a171ca
压缩公钥(33 字节)02ff812e26116a9aa140abe629e7f8a38401653caf925119def59ed3758c67ee80
hash160 = witness 程序(20 字节)21f57b6debcfc5b67182dfb4af1641f0a8189012
redeem script(22 字节)001421f57b6debcfc5b67182dfb4af1641f0a8189012
redeem script 的 SHA-256a78eb2472f4853354a86bd16be63eb2f5c2a3511b74a40073b3e1973135ec2e6
redeem script 的 hash160(20 字节)823333d5fd23a83661e8e47629552c4a5bfc8b6e
载荷 = 05 ‖ 脚本哈希(21 字节)05823333d5fd23a83661e8e47629552c4a5bfc8b6e
校验和(4 字节)acbfef44
被编码的 25 字节05823333d5fd23a83661e8e47629552c4a5bfc8b6eacbfef44
P2SH-P2WPKH 地址3DZT76KyKyc5zkzvLugP8umgt4RPY4XPQw
支付它的 scriptPubKey(23 字节)a914823333d5fd23a83661e8e47629552c4a5bfc8b6e87
同一私钥的原生 SegWit 姊妹地址bc1qy86hkm0telzmvuvzm76279jp7z5p3yqjnaerk6
同一私钥的 P2PKH 姊妹地址146ZNjH7XTXnMd1ofe3z7CL2i8WM7N2UqT

注意原生与嵌套这两个姊妹地址共用同一个 20 字节 witness 程序 21f57b6d…9012,却给出完全不同的 地址 —— 而且从外部看,scriptPubKey 也毫不相干。只有嵌套的那一个被包进了第二层哈希。

8. 这个地址不是什么

SegWit 地址必须使用压缩公钥

witness 程序必须是 33 字节压缩公钥的哈希。若对 65 字节非压缩公钥求哈希再构造 3… 地址,会得到 一个看起来完全合法的字符串,但按标准性策略你无法花掉它。如果你正在清空一把 2009 年前后的密钥,请先推导出 压缩公钥 —— 这个区别的来龙去脉见非压缩地址页面。

9. 这一步在推导链上的位置

私钥 → 压缩公钥→ 公钥 → hash160→ 0x0014 ‖ 程序→ 对脚本求 hash160→ Base58Check→ 3… 地址

10. 安全须知

永远不要把真实私钥粘进你无法掌控的页面

谁看见了私钥,谁就能花掉由它派生的一切地址上的币 —— 3… 地址也不例外,因为钱包随时可以公开 redeem script。本服务器在本地用 PHP 计算且不做记录,但这条保证的边界就是运营者本身。真要管钱,请用离线工具或 硬件钱包。

11. 常见错误

12. 速查表

项目取值
公式Base58Check(0x05 ‖ hash160(0x0014 ‖ hash160(压缩公钥)))
redeem script0x00 0x14 ‖ 20 字节 hash160(公钥) = 22 字节
脚本哈希对这 22 字节做 hash160
版本字节主网 0x05(3…),测试网 0xC4(2…)
被编码的载荷25 字节 = 1 + 20 + 4
scriptPubKeya914 <脚本哈希> 87 = 23 字节
花费时的输入体积91 vB(P2PKH 148,P2WPKH 68)
派生路径约定BIP49,m/49'/0'/0'/0/i
演示地址3DZT76KyKyc5zkzvLugP8umgt4RPY4XPQw
抗可塑性是 —— 签名在 witness 里,不在 txid 里